我有一个自定义小部件,它继承了QWidget。它有自己的paintEvent,我无法改变它。所以我想在我的对话框对象中使用这样的小部件,但是我需要在绘制自己的图形之后在其上绘制一些图形(该小部件在其上绘制视频帧,我需要在其上绘制一些线条)。我可以在每个小部件的paintEvent之后绘制吗?我使用了installEventFilter并捕获了事件wuth类型Qt :: Paint,但我看不到任何我已经淹死的东西。还有其他办法吗?
答案 0 :(得分:3)
您可以从自定义窗口小部件类派生,重新实现paintEvent
,然后先调用继承的paintEvent
,然后执行绘图。
您可以在窗口小部件上安装事件过滤器并执行相同操作:首先调用窗口小部件paintEvent
,然后执行绘图。
隐藏其他窗口小部件。创建自己的小部件,并在小部件的render
中调用其他小部件的paintEvent
方法,然后进行绘制。由于其他窗口小部件可能会渲染随时间变化的视频帧,因此您可能需要使用计时器来update()
您的窗口小部件。
在任何情况下,您都不会修改第三方自定义小部件。
为了调用其他窗口小部件的受保护paintEvent
,您需要使用QWidget
,即使只是一个虚拟的,不可见的。
答案 1 :(得分:2)
这是一个非常简单的代码示例,可以在自定义小部件中绘制。它在QPushButton中绘制一个蓝色矩形。
使用的方法正是@Kuba
在选项1中描述的方法因此,您从要绘制的自定义窗口小部件类继承,重新实现paintEvent
,然后首先调用继承的paintEvent
并执行绘图。
希望这有帮助
#include <QApplication>
#include <QPushButton>
#include <QPainter>
#include <QPaintEvent>
// inherit from the class over which you want to draw
class DrawOverButton : public QPushButton
{
Q_OBJECT
public:
DrawOverButton(const QString &text, QWidget *parent = 0) :
QPushButton(text, parent)
{
// enlarge the button so there is some space to draw in
setStyleSheet("QPushButton {min-height: 60px; "
"min-width: 120px; margin: 5px;}");
}
protected:
virtual void paintEvent(QPaintEvent *event) {
// call the base class paint event method
// this will draw the base class content
QPushButton::paintEvent(event);
// draw a blue border inside the button
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(QColor("#3cf"), 4));
const int distance = 20;
painter.drawRoundedRect(QRect(distance, distance,
width() - 2 * distance, height() - 2 * distance),
10, 10);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DrawOverButton *button = new DrawOverButton("Button");
button->show();
return a.exec();
}
#include "main.moc"