在派生类中调用父类'paint事件?

时间:2014-11-24 12:18:38

标签: c++ qtstylesheets qt5.3 qtwidgets

QDockWidget派生类中我enable style sheet支持如下:

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或者这是错误的(如果是这样请详细说明)。在原始code example中,父函数被 NOT 调用,但我想知道这是否正确?它会错过那里的任何功能,不会吗?

备注:上面的代码允许使用带有派生类的样式表,如下所述: Qt stylesheet in derived class in C++ namespace (selector)

1 个答案:

答案 0 :(得分:2)

这就是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