【问题标题】:QPainter Save StateQPainter 保存状态
【发布时间】:2012-10-05 06:37:56
【问题描述】:

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

【问题讨论】:

  • 除了Qt如何做到这一点,你不能只是将增量更改绘制到图像中,然后在更新中只显示这个图像吗?

标签: c++ linux qt qwidget qpainter


【解决方案1】:

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

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

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

【讨论】:

  • 这样做的缺点是它很早就对绘画进行了光栅化。因此,如果有人(例如 graphicsview)使用转换后的 qpainter 调用您的paintevent 处理程序,您将获得质量很差的结果,因为显示的 qpixmap 已缩放。
  • @JohannesSchaub-litb 嗯,没想到这个。我猜QPicture 在这种情况下会是更好的选择?
  • 编辑:我的建议是使用 QPainterPath。已删除 - 因为我没有在 QPainterPaths 上看到 System.exit 的答案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我使用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); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2012-05-02
      相关资源
      最近更新 更多