QPainter保留以前的图纸

时间:2015-10-04 13:34:27

标签: c++ qt qpainter

这是我第一次使用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属性的开始和结束。

班级团体:

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 * );

};

1 个答案:

答案 0 :(得分:5)

QPicture记录QPainter个命令。另外,从其文档中您可以阅读:

  

请注意,每次调用时都会重置painter命令列表   QPainter :: begin()函数。

带有绘图设备的QPainter构造函数会调用begin()。因此,每次删除旧的录制命令。

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

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

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

此外,如果您希望在艺术画笔而不是QBrush中介绍画笔的概念,您可能需要查看此approach to draw the line

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