我有一个自定义小部件,它继承了 QWidget。它有自己的paintEvent,我无法更改它。所以我想在我的对话框对象中使用这样的小部件,但我需要在它绘制自己的图形之后在其上绘制一些图形(该小部件在其上绘制视频帧,我需要在其上绘制一些线条)。我可以在该小部件的paintEvent之后每次绘制吗?我使用了 installEventFilter 并捕获了 Qt::Paint 类型的事件,但我看不到任何我淹死的东西。还有其他方法吗?
问问题
5346 次
2 回答
3
您可以从自定义小部件类派生,重新实现
paintEvent
,并首先调用继承的paintEvent
,然后进行绘图。您可以在小部件上安装事件过滤器并执行相同操作:
paintEvent
首先调用小部件,然后进行绘图。隐藏其他小部件。创建您自己的小部件,并
render
在您的小部件中调用其他小部件的方法paintEvent
,然后进行绘图。由于另一个小部件可能正在渲染随时间周期性变化的视频帧,因此您可能需要对update()
小部件使用计时器。
在这两种情况下,您都不会修改第 3 方自定义小部件。
为了调用其他小部件的受保护paintEvent
,您需要使用一个QWidget
,即使只是一个虚拟的、不可见的。
于 2013-09-26T02:09:46.237 回答
3
这是一个非常简单的代码示例,它在自定义小部件中绘制。它在 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"
于 2013-09-26T06:15:54.117 回答