Вызвать событие рисования родительского класса в производном классе?

В производном классе QDockWidget я включаю поддержку таблицы стилей следующим образом:

void CDockWidget::paintEvent(QPaintEvent *event)
    {
        QStyleOption opt;
        opt.initFrom(this);
        QPainter p(this);
        this->style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
        // call QDockWidget::paintEvent(event) here ???????
        // I have called QDockWidget::paintEvent(event) here, but did not notice any difference 
    }

Вопрос: Должен ли я называть родительский класс paintEvent или это неправильно (если да, пожалуйста, уточните). В исходном примере кода родительская функция НЕ вызывается , но интересно, правильно ли это? Там не будет никакой функциональности, не так ли?

Примечание. Приведенный выше код позволяет использовать таблицы стилей с производными классами, как описано в: Таблица стилей Qt в производном классе в пространстве имен C++ (селектор)


person Horst Walter    schedule 24.11.2014    source источник
comment
Я не уверен, но я думаю, вам следует нарисовать QStyle::PE_FrameDockWidget вместо QStyle::PE_Widget. Попробуйте и проверьте.   -  person Iuliu    schedule 24.11.2014


Ответы (1)


Это то, что QDockWidget делает внутри. Похоже, ваше управление компоновкой не будет происходить в вашем текущем коде. Я ожидаю, что вы сможете увидеть проблему, изменив размер окна или что-то подобное, что изменит макет.

void QDockWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    QDockWidgetLayout *layout
        = qobject_cast<QDockWidgetLayout*>(this->layout());
    bool customTitleBar = layout->widgetForRole(QDockWidgetLayout::TitleBar) != 0;
    bool nativeDeco = layout->nativeWindowDeco();

    if (!nativeDeco && !customTitleBar) {
        QStylePainter p(this);
        // ### Add PixelMetric to change spacers, so style may show border
        // when not floating.
        if (isFloating()) {
            QStyleOptionFrame framOpt;
            framOpt.init(this);
            p.drawPrimitive(QStyle::PE_FrameDockWidget, framOpt);
        }

        // Title must be painted after the frame, since the areas overlap, and
        // the title may wish to extend out to all sides (eg. XP style)
        QStyleOptionDockWidgetV2 titleOpt;
        initStyleOption(&titleOpt);
        p.drawControl(QStyle::CE_DockWidgetTitle, titleOpt);
    }
}

https://qt.gitorious.org/qt/qt/source/a71e6490b5415f24e38681015ae05326a004a7b7:src/gui/widgets/qdockwidget.cpp#LNaN-NaN

person Jonathan Mee    schedule 24.11.2014
comment
Странно, я не замечаю никакой разницы, вызываю ли я родительскую функцию или нет... - person Horst Walter; 24.11.2014
comment
@HorstWalter Хммм ... тогда ты можешь быть в безопасности? У меня возникли проблемы с отслеживанием того, что именно делает этот код на законных основаниях... - person Jonathan Mee; 24.11.2014
comment
он позволяет использовать таблицы стилей с производными классами (см. соответствующее обновление, если вам интересно). Как это работает подробно, я не могу сказать, для этого требуется общий код (найденный на сайте Qt, как указано выше). Без них вы не сможете использовать селекторы таблиц стилей для производных классов. - person Horst Walter; 24.11.2014