QPainter保留以前的图纸

ana*_*Bad 8 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();
}
Run Code Online (Sandbox Code Playgroud)

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

};
Run Code Online (Sandbox Code Playgroud)

dte*_*ech 6

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

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

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

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

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

Canvas() : pic(width,height) {...}
Run Code Online (Sandbox Code Playgroud)

此外,如果你想在艺术画笔中引入画笔的概念而不是QBrush,你可能想看看这种方法画线.

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