【发布时间】: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.