Установка QStyleOptionComboBox.currentText не влияет на нарисованный виджет - PullRequest
5 голосов
/ 05 апреля 2011

Я хочу нарисовать QComboBox внутри делегата, который отлично работает, за исключением того, что я не могу понять, как нарисовать начальный текст, который виден внутри поля со списком.

Документация гласит, что QStyleOptionComboBox.currentText содержит: «текст для текущего элемента поля со списком». но установка переменной не имеет никакого эффекта.

Это мой код:

void MyDelegate::paint(QPainter *painter,
    const QStyleOptionViewItem& option,
    const QModelIndex& index) const
{
    QStyleOptionComboBox comboBoxOption;
    comboBoxOption.rect = option.rect; 
    comboBoxOption.state = option.state;
    comboBoxOption.state |= QStyle::State_Enabled;
    comboBoxOption.editable = false;
    comboBoxOption.currentText = "CCC"; // This doesn't show up.

    QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &comboBoxOption, painter);
}

Глядя на qwindowsxpstyle.cpp Я не вижу, где нарисован текст "реального" поля со списком, поскольку currentText не используется внутри метода drawComplexControl. Единственное место, где он используется для стиля Windows XP - это qcommonstyle.cpp (строка 2107, Qt 4.7.2), но я не могу понять, как эти два класса играют вместе.

1 Ответ

7 голосов
/ 05 апреля 2011

Кажется, вам также нужно заставить Qt рисовать метку поля со списком, в дополнение к сложному элементу управления. Попробуйте это:

QApplication::style()->drawControl(QStyle::CE_ComboBoxLabel, &comboBoxOption, painter)

Если я правильно прочитал документацию и источник, это может заставить QStyle нарисовать метку поля со списком. Кажется странным, что вам нужно было бы указать и то, и другое ... но, если честно, я не очень много знаю о том, как рисуют стили Qt.

...