【问题标题】:Is it not possible to have multiple objects in Qt being painted simultaneously?Qt 中不能同时绘制多个对象吗?
【发布时间】:2016-03-12 06:26:12
【问题描述】:
  • 我在 Qt 文档中阅读了以下内容。

Qt documentation on QPainter

The original question on SO, that I looked into.

  • 所以,我有两个类,它们有自己的paint() 函数。绘制函数将在接收到它们各自的绘制事件时被调用,这些绘制事件是由用户在不同且独立的操作上触发的。这很好用。

    • 现在由于某种原因,我需要同时显示和更新这两个对象。
    • 很简单,将这两个项目都添加到场景中是行不通的。仅显示和更新其中之一。重构代码对我来说不是问题。我可以重新排列这两个类,以便它们都从一个paint() 中绘制。

但这真的让我想知道,这就是我的问题(我也用谷歌搜索了一点),有几十个对象的场景是如何同时绘制的(至少它们给人一种并发的错觉)?以某种方式或通过一些基于时间的交错使用线程?

也许这是一个愚蠢的问题。我不知道。

【问题讨论】:

  • 为什么需要同时显示和更新它们?为什么一个接一个地做是不够的?除非您的绘画代码异常缓慢,否则没有人能够分辨出其中的区别。
  • 如果将它们都添加到场景中,它们都应该被绘制。但是,如果您将它们一个接一个地添加到场景中,这应该会自动发生。最终,只要在同一个线程中运行,所有代码都会一个接一个地执行。
  • 嗯,其中一个对象在很长一段时间内都是可见的,例如网格和交叉线。第一个对象的绘制调用有效地阻止了另一个对象的绘制调用,该对象应该绘制一些 QGraphicsItem。在我看来,唯一的解决方法是让一个 paint() 处理所有绘图。 2 个具有自己的 paint() 函数的不同对象将不起作用。这不是文档链接也说的吗?使用调试器运行代码,我看到第一个对象的paint() 函数被重复调用,阻止了重新绘制另一个对象的调用。
  • 澄清一下 -> 网格和交叉线随着鼠标的移动而更新,提供光标的坐标信息。因此它们不断更新,因此不断地重新绘制。如果他们是静态的,他们的绘画事件就不会被调用。并且只有绘制 QGraphicsItem 的其他类的绘制事件才会被调用。因此,我原来的问题。
  • void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) 每个paint函数,在两个类中都有一个painter。正如文档所述,在任何给定时间,一台绘画设备只能有一位画家。

标签: c++ qt paint


【解决方案1】:

这确实是一个关于现实中不存在的虚构问题的愚蠢问题。图形视图将按产生所需结果所需的顺序安排项目的连续绘制。现在,如果您的代码没有实现预期的结果,那将是一个完全不同的主题。没有并发,那些是只发生在主线程中的连续操作。

如果您的绘图非常复杂,请使用QImage 上的辅助线程进行绘图,并使用QImage 作为缓存在各自的绘图函数中绘制您的项目。

现在出于某种原因,我需要在 同一时间。

那可能是什么原因? “同时”是什么意思?在一个框架中?相隔一毫秒是否太多而不能符合“同时”的条件?

【讨论】:

    【解决方案2】:

    关于QWidget 绘画:绘画事件由小部件合成器传递给各个小部件。它与默认光栅后端的工作方式如下:层次结构中最顶层的小部件由QImage 支持。当要重绘任何子小部件时,合成器将复合绘制事件传递给覆盖要重绘区域的小部件。这是在合成器遍历小部件图时顺序完成的。

    回复QGraphicsItem绘画:绘画“事件”由场景传递到单个项目。要绘制的项目是根据需要更新的区域、明确标记要更新的项目等来选择的。绘制器被设置为将项目与场景的其余部分正确合成。当场景遍历项目图时,对paint 的调用按顺序进行。

    由于数据依赖性以及paintEventpaint 不要求线程安全这一事实,并行 通常不可能做到这些.

    您的问题与此没有直接关系,您需要展示一个完整的代码示例来重现您的问题。您对项目的实施很可能忽略了项目行为的一些要求。

    【讨论】:

    • 是的!你说的对。我应该发布我的问题的“最小工作示例”。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多