Из-за того, что тролли до сих пор не реализовали фолдинг в QGroupBox-е, решил сделать некую обвязку, чтобы оный заработал.
Для этого планировалось использовать setCheckable(), setFlat() и заменить иконки checkbox-a на (-)/(+).
Т.к. расширить QGroupBox через новый класс не представляется возможным (блин, эти умники зачем-то отказались от QCheckBox-a для реализации checkbox-a и всё перенесли в стили, через которые до стилей самого checkbox-a из QGroupBox-a не добраться), единственным способом изменить иконки checkbox-a можно только через CSS
Ладно, но меня абсолютно не устраивает то, что image задается либо через файл либо через ресурс, т.к. хотелось использовать стилизованные иконки определенные для QStyle::PE_IndicatorBranch.
Поэтому вопрос - возможно ли указать CSS-у использовать динамические images?
Пока делаю так:
static void createIndicatorSSIcon( QWidget* w, const QString& name, bool checked )
{
QFileInfo info;
QString key = QString( "qt_pixmap_:%1_%2_0_0" ).arg( name ). // формат ключа подглядел в QPixmap::load()
arg( QString::number( info.lastModified().toTime_t() ) );
static const int s = 9; // ### hardcoded in qcommonstyle.cpp
QStyleOption o;
o.rect = QRect( 0, 0, s, s );
o.palette = w->palette();
o.state = QStyle::State_Children;
if( !checked )
o.state |= QStyle::State_Open;
QPixmap* pm = new QPixmap( s, s );
QPainter p( pm );
w->style()->drawPrimitive( QStyle::PE_IndicatorBranch, &o, &p, w );
QPixmapCache::insert( key, *pm );
}
{
. . .
createIndicatorSSIcon( dialog, "groupbox_checked", false );
createIndicatorSSIcon( dialog, "groupbox_unchecked", true );
QGroupBox* gb;
gb->setStyleSheet(
"QGroupBox::indicator:checked{ image: url(:groupbox_checked); }"
"QGroupBox::indicator:unchecked{ image: url(:groupbox_unchecked); }" );
. . .
}
Такой номер прокатил, но это всё-таки hack, а хочется по-красивее.
И ещё, может подскажете нормальное руководство по Qt CSS?