1

我有一个自定义小部件,它继承了 QWidget。它有自己的paintEvent,我无法更改它。所以我想在我的对话框对象中使用这样的小部件,但我需要在它绘制自己的图形之后在其上绘制一些图形(该小部件在其上绘制视频帧,我需要在其上绘制一些线条)。我可以在该小部件的paintEvent之后每次绘制吗?我使用了 installEventFilter 并捕获了 Qt::Paint 类型的事件,但我看不到任何我淹死的东西。还有其他方法吗?

4

2 回答 2

3
  1. 您可以从自定义小部件类派生,重新实现paintEvent,并首先调用继承的paintEvent,然后进行绘图。

  2. 您可以在小部件上安装事件过滤器并执行相同操作:paintEvent首先调用小部件,然后进行绘图。

  3. 隐藏其他小部件。创建您自己的小部件,并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 回答