QPainter保留了以前的图纸

QPainter keep previous drawings

本文关键字:保留 QPainter      更新时间:2023-10-16

这是我第一次使用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的类,它有两个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 * );
};

QPicture记录QPainter的命令。你还可以从它的文档中读到:

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

QPainter构造器与油漆装置调用begin()。所以每次旧的记录命令被删除。

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

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

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

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

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