QPainter保留了以前的图纸
QPainter keep previous drawings
这是我第一次使用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
吸引到您的小部件将花费越来越多的时间。你可以通过同时使用QPicture
和QPixmap
来解决这个问题,并同时绘制两者,使用图片来记录动作和像素图,以避免不断地重新绘制图片,即使你将做双倍的工作,它仍然会更有效率,同时你仍然保留使用图片以不同分辨率重新光栅化或保存绘图历史的可能性。但我怀疑QPicture
会做得很好,因为你的绘图应用程序开始形成一个实际的绘图应用程序,例如,当你开始使用pixmap画笔模板等。
- 有根的二进制搜索树.保留与其父级的链接
- 为多个会话保留XPtr
- 保留对其他类的成员函数的引用
- 指针保留字符串
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 必须为 C++20 协程帧保留多少内存?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- QPainter 将 QBrush 设置为 在 QT/C++ 中绘制文本
- 局部变量保留函数中的值
- 保留函数指针模板参数
- 变量超出范围后如何保留向量值?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 即使在使用 delete[] 后仍保留的元素
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将成员函数保留为未定义
- QPainter保留了以前的图纸