在QDockWidget中的停靠小部件上绘制/绘制

时间:2012-06-14 14:04:57

标签: qt inheritance draw paint qdockwidget

我在Qt中有一个继承QDockWidget的类。该类包含另一个小部件。 是否有可能在我的QDockWidget继承类中定义一个函数,该函数在包含的小部件之上绘制东西?就像绘画独立于包含的小部件,但要链接到继承的类。

谢谢

2 个答案:

答案 0 :(得分:9)

当然有可能。事实上,这很简单。您需要在QDockWidget中放置一个位于其他所有内容之上的子窗口小部件。要这样做,它必须是您添加到dockwidget的最后一个子窗口小部件。该小部件不得绘制其背景,然后它可以绘制dockwidget的任何子节点。小部件的大小必须跟踪父小部件的大小。

以下是一个独立的示例。

Screenshot of the example

// https://github.com/KubaO/stackoverflown/tree/master/questions/overlay-line-11034838
#include <QtGui>
#if QT_VERSION > QT_VERSION_CHECK(5,0,0)
#include <QtWidgets>
#endif

class Line : public QWidget {
protected:
   void paintEvent(QPaintEvent *) override {
        QPainter p(this);
        p.setRenderHint(QPainter::Antialiasing);
        p.drawLine(rect().topLeft(), rect().bottomRight());
    }
public:
    explicit Line(QWidget *parent = nullptr) : QWidget(parent) {
       setAttribute(Qt::WA_TransparentForMouseEvents);
    }
};

class Window : public QWidget {
    QHBoxLayout layout{this};
    QPushButton left{"Left"};
    QLabel right{"Right"};
    Line line{this};
protected:
    void resizeEvent(QResizeEvent *) override {
        line.resize(size());
    }
public:
    explicit Window(QWidget *parent = nullptr) : QWidget(parent) {
        layout.addWidget(&left);
        right.setFrameStyle(QFrame::Box | QFrame::Raised);
        layout.addWidget(&right);
        line.raise();
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    Window w;
    w.show();
    return app.exec();
}

答案 1 :(得分:0)

AFAIK:没有。

窗口小部件按深度顺序绘制,因此无论您的QDockWidget派生类绘制什么,它们都会在更新时被所包含的窗口小部件覆盖(之后立即毫无疑问,因为绘制更新会传播到子窗口小部件)。