【问题标题】:Draw on custom widget after it's drawing绘制后在自定义小部件上绘制
【发布时间】:2013-09-25 20:56:43
【问题描述】:

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

【问题讨论】:

  • 您可以覆盖您的自定义小部件绘制事件并在那里绘制。这是一个例子:qt-project.org/doc/qt-4.8/painting-basicdrawing.html
  • 不不,它有它自己的paintEvent实现,但我不能改变它,因为渲染视频帧在那里实现,它不是我的代码,我用它作为动态库
  • @mmmaaak:它是!=它。我在你的帖子中修复了这个问题,但你也一直在 cmets 中写作。请理解其中的区别。读起来很烦人……

标签: c++ qt qwidget


【解决方案1】:
  1. 您可以从自定义小部件类派生,重新实现paintEvent,并先调用继承的paintEvent,然后进行绘图。

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

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

在这两种情况下,您都没有修改第 3 方自定义小部件。

为了调用其他小部件的受保护paintEvent,您需要使用QWidget,即使只是一个虚拟的、不可见的。

【讨论】:

    【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多