Как написать paintEvent() для подкласса QComboBox

Я создал подкласс QComboBox, чтобы настроить его. Я написал следующий метод paintEvent(), чтобы проверить, правильно ли применяется моя таблица стилей, прежде чем приступить к настройке. Однако, если я использую этот paintEvent, выбранный элемент не отображается (уже выбранный или тот, который я недавно выбрал).

class MyComboBox: public QComboBox
{
    Q_OBJECT
public:
    MyComboBox(QWidget *parent = 0): QComboBox(parent){}

    virtual void paintEvent(QPaintEvent* pEvent)
    {
    QStylePainter painter(this);
    QStyleOptionComboBox opt;
    initStyleOption(&opt);
    painter.drawComplexControl(QStyle::CC_ComboBox, opt);
    QVariant itemData = this->itemData( this->currentIndex(), Qt::DisplayRole);
    if(!itemData.isNull() && qVariantCanConvert<QPen>(itemData))
        style()->drawItemText(&painter,this->rect(),Qt::AlignLeft,(this->palette()), true, itemData.toString());
    }
};

Как исправить событие paintEvent? Кроме того, есть ли документация по paintEvent для разных элементов управления Qt?


person go4sri    schedule 03.10.2012    source источник
comment
Попробуйте добавить QComboBox::paintEvent(pEvent) в конец вашей функции.   -  person hank    schedule 03.10.2012
comment
@hank Чего бы это добилось? OP уже явно рисует поле со списком.   -  person cmannett85    schedule 03.10.2012
comment
@go4sri Можете ли вы описать, что именно нарисовано? (а еще лучше выложите фото).   -  person cmannett85    schedule 03.10.2012
comment
@Хэнк - да. это решило проблему. Я могу видеть контент. Сейчас я попробую посмотреть, применяется ли таблица стилей.   -  person go4sri    schedule 04.10.2012
comment
@ cmannett85: поле было нарисовано, но выбранный элемент не отображался в поле. С этим изменением отображается выбранный контент.   -  person go4sri    schedule 04.10.2012
comment
@ go4sri Тогда я не понимаю, чего вы пытались достичь, вызывая метод базового класса, вы стираете всю картину, которую вы сделали, и просто рисуете «нормальный» QComboBox - вы можете также удалить весь метод, как это было бы имеют тот же эффект.   -  person cmannett85    schedule 04.10.2012


Ответы (1)


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

person ISTB    schedule 03.10.2012