【问题标题】:QPainter keep previous drawingsQPainter 保留以前的图纸
【发布时间】:2016-01-01 06:01:23
【问题描述】:

这是我第一次使用 Qt,我必须制作一个与 Qt 等效的 MSPaint。然而,我在画线时遇到了麻烦。我目前可以通过单击屏幕上的某处并释放其他位置来绘制一条线,但是当我绘制第二条线时,前一条线将被删除。绘制另一个项目时如何保留以前绘制的项目?

void Canvas::paintEvent(QPaintEvent *pe){
    QWidget::paintEvent(pe);
    QPainter p(this);
    p.drawPicture(0,0,pic);
}

void Canvas::mousePressEvent(QMouseEvent *mp){
    start = mp->pos();
}

void Canvas::mouseReleaseEvent(QMouseEvent *mr){
    end = mr->pos();
    addline();
}

void Canvas::addline()Q_DECL_OVERRIDE{
    QPainter p(&pic);
    p.drawLine(start,end);
    p.end();
    this->update();
}

Canvas是一个派生QWidget的类,它有2个QPoint属性start和end。

类主体:

class Canvas : public QWidget{
Q_OBJECT
private:
    QPoint start;
    QPoint end;
    QPicture pic;
public:
    Canvas(){paint = false;setAttribute(Qt::WA_StaticContents);}
    void addline();
protected:
    void paintEvent(QPaintEvent *);
    void  mousePressEvent( QMouseEvent * );
    //void  mouseMoveEvent( QMouseEvent * );
    void  mouseReleaseEvent( QMouseEvent * );

};

【问题讨论】:

  • 我认为问题在于每次添加新行时都会创建一个新的 QPainter 变量,这会导致之前存储的 QPainter 变量被销毁,因为它已经离开了范围(但由于性质OpenGL,无论如何它都保存在帧缓冲区中)。尝试让 QPainter 成为一个类范围的变量,看看是否有帮助。
  • @Poriferous——没关系,pic是他的缓冲区,painter应该不会影响缓冲区数据。这并不意味着保留画家是一个坏主意。
  • @anaBad - 什么是pic?向我们展示您的小部件类的主体。
  • pic 将是 QPaintDevice 这是 QPainter 没有被吸引到的。因此,我认为这是一个范围问题。
  • @Poriferous - 但从他的代码看来,pic 具有类范围。它应该在不同的调用之间持续存在。从到目前为止发布的代码中,我看不出任何可以清除 pic.

标签: c++ qt qpainter


【解决方案1】:

QPicture 记录QPainter 命令。您还可以从其文档中阅读以下内容:

请注意,每次调用 QPainter::begin() 函数。

而带有绘图设备的QPainter 构造函数确实调用了begin()。所以每次旧记录的命令都会被删除。

使用它可能听起来很诱人,因为它确实说明了一些好处,例如,它与分辨率无关,但这并不是绘图应用程序在现实中的工作方式。切换到QPixmap,您的绘图将保留。

另外,不要忘记初始化像素图,因为默认情况下它是空的,您将无法在其上绘图。

Canvas() : pic(width,height) {...}

此外,如果您想在艺术画笔中引入画笔的概念,而不是QBrush,您可能想看看这个approach to draw the line

编辑:请注意,您应该能够通过不多次调用 begin() 来防止 QPicture 丢失其内容。如果您创建一个仅在类范围内绘制的painter,并在构造函数中调用begin,则应该保留不同的记录绘制操作。但是随着它们的数量增加,将QPicture 绘制到您的小部件将花费越来越多的时间。您可以通过同时使用QPictureQPixmap 来解决这个问题,并绘制到两者,使用图片记录动作和像素图以避免不断重绘图片,即使您将做双倍的工作仍然更有效率,同时您仍然可以使用图片以不同的分辨率重新光栅化或保存绘图历史。但我怀疑QPicture 是否会做得很好,因为您的绘图应用程序开始形成实际的绘图应用程序,例如当您开始使用像素图刷模板等时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2016-07-30
    • 1970-01-01
    • 2023-03-24
    • 2011-10-22
    • 1970-01-01
    • 2023-02-25
    相关资源
    最近更新 更多