涂料/绘制在QDodckWidget停靠小部件的顶部(Paint/Draw on top of do

2019-06-25 11:53发布

我在Qt的一类,它继承QDockWidget。 而那类包含其他控件。 是否有可能定义窗口小部件包含在我的QDockWidget继承类的功能。它吸收了顶部的东西? 像绘画独立于包含小部件,但链接到继承类的。

谢谢

Answer 1:

当然这是可能的。 这是相当简单的事情,其实。 您需要将孩子的小工具,在你的一切之上坐在QDockWidget 。 要做到这一点的话,它必须是最后一个子部件添加到您dockwidget。 该小工具不能画出它的背景,然后它可以绘制在dockwidget的孩子。 该物件的尺寸必须跟踪父控件的大小。

下面是一个自包含的例子。

// 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();
}


Answer 2:

据我所知:没有。

Widget是画在深度顺序,所以无论你QDockWidget派生类涂料,将被包含的部件,当他们被更新(随即毫无疑问,因为油漆的更新传播到子控件)绘制了过来。



文章来源: Paint/Draw on top of docked widgets in QDodckWidget