我在 Qt 中有一个继承 QDockWidget 的类。该类包含另一个小部件。是否有可能在我的 QDockWidget 继承类中定义一个在包含的小部件之上绘制东西的函数?就像绘画独立于包含的小部件但要链接到继承的类。
谢谢
我在 Qt 中有一个继承 QDockWidget 的类。该类包含另一个小部件。是否有可能在我的 QDockWidget 继承类中定义一个在包含的小部件之上绘制东西的函数?就像绘画独立于包含的小部件但要链接到继承的类。
谢谢
当然有可能。事实上,这很简单。您需要放置一个子小部件,该小部件位于QDockWidget
. 为此,它必须是您添加到停靠小部件的最后一个子小部件。该小部件不得绘制其背景,然后它可以绘制到任何停靠小部件的孩子。小部件的大小必须跟踪父小部件的大小。
下面是一个独立的例子。
// 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();
}
阿法克:不。
小部件是按深度顺序绘制的,因此无论您的QDockWidget
派生类绘制什么,都会在更新时被包含的小部件绘制(毫无疑问,紧随其后,因为绘制更新会传播到子小部件)。
已接受答案的 Python 版本:
# Created by BaiJiFeiLong@gmail.com at 2022/1/15 10:22
from PySide2 import QtWidgets, QtGui, QtCore
app = QtWidgets.QApplication()
widget = QtWidgets.QWidget()
line = QtWidgets.QFrame(widget)
line.paintEvent = lambda _: QtGui.QPainter(line).drawLine(line.rect().topLeft(), line.rect().bottomRight())
line.setAttribute(QtCore.Qt.WidgetAttribute.WA_TransparentForMouseEvents)
widget.setLayout(QtWidgets.QGridLayout(widget))
widget.layout().addWidget(QtWidgets.QPushButton("CLICK ME", widget))
widget.resizeEvent = lambda event: line.resize(event.size())
line.raise_()
widget.show()
app.exec_()
请注意,这不适用于QSplitter
,在这种情况下,您应该将QMainWindow
其用作父小部件。