Qt:QSS和drawComplexControl()

时间:2014-02-02 22:17:42

标签: c++ qt qtstylesheets

我有一个包含QTableView的QDialog,以及一个显示枚举类型的QComboBox的自定义委托。 当未选择该行时,我仍然希望QComboBox可见(我想避免使用QTableView :: openPersistentEditor())。 为此,自定义委托将paint事件转发到以下方法:

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设计了组合框控件,但是尽管使用了QTableView的样式,drawComplexControl()似乎忽略了这一点。这是一个截图:

Application screenshot

drawComplexControl()是否可以考虑样式表?

由于

2 个答案:

答案 0 :(得分:1)

我认为唯一的方法是使用QPixmap :: grabWidget()获取小部件。并在委托中使用此图像。 似乎因为QSS limitation

而无法做到

答案 1 :(得分:0)

我相信你需要使用带有cast style()的脏黑客来私有QStyleSheetStyle