Qt: QSS и drawComplexControl()

У меня есть QDialog, содержащий QTableView, а также пользовательский делегат, показывающий QComboBox для типов перечисления. Когда строка не выбрана, я все равно хочу, чтобы QComboBox был виден (я хотел бы избежать использования QTableView::openPersistentEditor()). Для этого пользовательский делегат перенаправляет событие рисования следующему методу:

QStyleOptionViewItem &option) const
{
    painter->save();

    QStyleOptionComboBox comboBoxOption;
    comboBoxOption.rect = option.rect;
    comboBoxOption.state = option.state;
    comboBoxOption.state |= QStyle::State_Enabled;
    comboBoxOption.editable = false;
    comboBoxOption.currentText = enumInfo.valueToKey(curValue);

    // The cast is successful, and srcWidget is the QTableView
    QWidget *srcWidget = qobject_cast<QWidget *>(option.styleObject);

    // style->metaObject()->className() = QStyleSheetStyle
    QStyle *style = srcWidget ? srcWidget->style() : QApplication::style();

    // However, the QSS is ignored here (while srcWidget->styleSheet() correctly
    // returns the style I've set in Qt Designer)
    style->drawComplexControl(QStyle::CC_ComboBox, &comboBoxOption, painter, srcWidget);
    style->drawControl(QStyle::CE_ComboBoxLabel, &comboBoxOption, painter, srcWidget);

    painter->restore();
}

Проблема в том, что я стилизовал поле со списком, используя QSS, но drawComplexControl(), похоже, игнорирует это, несмотря на использование стиля QTableView. Вот скриншот:

Скриншот приложения

Может ли drawComplexControl() учитывать таблицу стилей?

Спасибо


person XDnl    schedule 02.02.2014    source источник
comment
Хорошо, я нашел решение: drawComplexControl() работает, как и ожидалось, только если мы вызываем его из подкласса QStyleSheetStyle (приведение не требуется) И мы передаем экземпляр виджета с примененным стилем (в моем вопросе srcWidget указывает на QTableView, который неправильно. Вместо этого мне нужен экземпляр QComboBox)   -  person XDnl    schedule 04.02.2014


Ответы (2)


Я думаю, что единственный способ — захватить виджет с помощью QPixmap::grabWidget(). И использовать это изображение в делегате. Кажется, что это невозможно сделать из-за QSS ограничение

person Dmitry Sazonov    schedule 03.02.2014
comment
Спасибо, я боялся такого вывода. Странно то, что переменная style на самом деле является QStyleSheetStyle (закрытым классом Qt), который отвечает за отрисовку виджетов в соответствии с таблицей стилей (и на самом деле это происходит с обычными виджетами!). Отсюда Qt Docs: Когда таблица стилей активна , QStyle, возвращаемый QWidget::style(), является стилем таблицы стилей-оболочкой, а не стилем для конкретной платформы. Стиль-оболочка гарантирует, что любая активная таблица стилей соблюдается (опущение) Я надеюсь, что это будет исправлено рано или поздно. - person XDnl; 03.02.2014

Я считаю, что вам нужно использовать грязные хаки с приведением стиля () к частному QStyleSheetStyle

person DmitryARN    schedule 03.02.2014
comment
Как это могло помочь? Насколько я знаю, drawComplexControl() является виртуальным в QStyle и наследование классов выглядит следующим образом: QStyleSheetStyle ---> QWindowsStyle ---> QCommonStyle --> QStyle. Более того, я пытался включить QStyleSheetStyle.h в свой код, но получил много ошибок компоновщика, которые не смог исправить. - person XDnl; 04.02.2014