1

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

4

3 回答 3

2

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

对于图像处理,Qt 有一堆类,最重要的是QImageand QPixmap,因为它们都是从 派生的QPaintDevice,所以可以直接用QPainter. 虽然QImage针对直接像素访问和文件 I/OQPixmap进行了优化,但针对在屏幕上显示进行了优化。它没有说哪个更适合绘制,但我会先QPixmap看看它的表现如何。

您还可以绘制另一个“图像”类,QPicture. 但这并不是真正存储渲染结果的图像,而只是记录了使用 完成的绘制命令,QPainter以便以后轻松回放。因此,我认为它的性能应该不会比“真实”图像好多少。但这可能值得一试,特别是如果绘图中涉及更多内容并且仅存储最终图像是不够的。

于 2012-10-05T07:07:49.583 回答
1

QPainter根本救不了“状态”,因为这不是他的目的。它唯一能做的就是画画。在你告诉它从 [x,y] 到 [x 1 ,y 1 ] 画一条线后,它会画出它,然后“忘记”一切。每个人都paintEvent()从头开始绘制小部件。因此,要添加元素,您每次都必须重新绘制现有元素。

于 2012-10-05T06:46:47.007 回答
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); 
于 2012-11-05T00:51:47.777 回答