QPainter保存状态

时间:2012-10-05 06:37:56

标签: c++ linux qt qwidget qpainter

我有一个QWidget,其中我使用QPainter对象绘制一些点,但是当调用update()方法时,QWidget的绘制被完全清除。有没有办法保存实际状态只是添加点,或者我必须保存每个点并在每个paintEvent()调用中绘制它们?基本上当我按箭头时,我必须在QWidget上显示一条线(这是为了汽车拉力赛)。

3 个答案:

答案 0 :(得分:2)

除了 SingerOfTheFall 的答案之外,您还可以将所有增量更改绘制到图像中,然后仅在每次更新调用中绘制此图像。

对于处理图像,Qt有一堆类,最重要的是QImageQPixmap,因为它们都来自QPaintDevice,所以可以直接用{ {1}}。鉴于QPainter针对直接像素访问和文件I / O进行了优化,QImage已针对在屏幕上显示进行了优化。它并没有说哪一个更适合绘图,但我会从QPixmap开始,看看它是如何表现的。

还可以绘制另一个“图像”类QPicture。但这实际上不是存储结果渲染的图像,而是仅记录使用QPixmap完成的绘制命令,以便以后轻松播放。因此,我认为它的表现不应该比“真实”图像好得多。但它可能值得一试,特别是如果图中有更多内容,只是存储最终图像是不够的。

答案 1 :(得分:1)

QPainter只是无法保存“状态”,因为这不是他的目的。它唯一能做的就是画画。在你告诉它从[x,y]到[x 1 ,y 1 ]绘制一条线之后,它会绘制它并“忘记”所有内容。每个paintEvent()开始从头开始绘制小部件。因此,要添加元素,您每次都必须重绘现有元素。

答案 2 :(得分:0)

实际上我使用QPainterPath解决了我的问题所以我可以将椭圆分组以绘制“动态”线:

QPainterPath* p = new QPainterPath(this); //this should be a class attribute to save all points
p->addEllipse(myCustomPoint); //we should add the points dynamically

QPainter painter(this); // On QPainter::paintEvent;
painter.drawPath(p);