【发布时间】:2016-03-12 06:26:12
【问题描述】:
- 我在 Qt 文档中阅读了以下内容。
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。正如文档所述,在任何给定时间,一台绘画设备只能有一位画家。