绘制后在自定义小部件上绘制

时间:2013-09-25 20:56:44

标签: c++ qt qwidget

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

2 个答案:

答案 0 :(得分:3)

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

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

  3. 隐藏其他窗口小部件。创建自己的小部件,并在小部件的render中调用其他小部件的paintEvent方法,然后进行绘制。由于其他窗口小部件可能会渲染随时间变化的视频帧,因此您可能需要使用计时器来update()您的窗口小部件。

  4. 在任何情况下,您都不会修改第三方自定义小部件。

    为了调用其他窗口小部件的受保护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"