【问题标题】:Draw on QWidget在 QWidget 上绘图
【发布时间】:2016-10-26 14:13:38
【问题描述】:

如何在 QWidget(表单上的元素)上绘图?

我阅读了许多教程,但没有一篇涵盖我真正要做的事情(在 QWidget 上绘制一些 Rect)。

我创建了一个继承自 QWidget 的 MyFigure 类,甚至在paint 中编写了一些代码来绘制一个矩形。 然后,在我的 Form Create 中创建 MyFigure 对象,然后显示它。

它不起作用!!!

【问题讨论】:

  • 我从您的问题中删除了您的联系信息。您可以将这些写在您的个人资料中。解决这里以外的事情也不符合stackoverflow的精神。以最少的方式分享您的代码,以便人们可以看到并理解您在做什么,并在 stackoverflow 上回答您

标签: qt inheritance drawing


【解决方案1】:

QGraphicsView 和 QGraphicsScene 对绘画很有好处,但是如果你想在 QWidget 上绘画你需要重新实现paintEvent:

#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
class Widget : public QWidget
{
public:
    explicit Widget(QWidget *parent=0);

    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
};

Widget::Widget(QWidget *parent) : QWidget(parent)
{
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter;
    painter.begin(this);
    painter.fillRect(event->rect(), Qt::white);
    QWidget::paintEvent(event);
    painter.end();
}

此代码将用白色填充您的小部件。

【讨论】:

  • 您的代码不可编译 Drawing/myfigure.cpp:3: error: undefined reference to `vtable for myFigure' 您有什么想法可以解决这个问题吗?
  • @fiter 哦,在“painter.end();”中忘记了 (),对不起。
  • @fiter 另外,如果你把它写在一个文件中(类声明必须在 *.h 中,并且在 *.cpp 中实现),你会遇到 Q_OBJECT 宏的问题。找出来。
  • 最好使用QGraphicsSceneQGraphicsView
  • 注意:1. painter.end() 是不必要的。这不是 JAVA:RAII 是一回事 :) 2. 由于 2016 年 - 更喜欢 overrideQ_DECL_OVERRIDE。 3. 同样,parent = nullptr,而不是parent = 0。 4. 无需拨打QWidget::paintEvent。小部件合成引擎做背景绘画等,而不是QWidget::paintEvent
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多