gpt4 book ai didi

c++ - 当 QGraphicsView 或 QWidget 完成绘制或渲染时是否存在信号或事件?

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:58 25 4
gpt4 key购买 nike

我正在尝试对应用程序计时,以查看加载某些信息和绘制图形需要多长时间。我的函数首先加载数据,然后绘制图形。

计时相当简单,它调用一个外部函数,从某个日期开始获取毫秒数。问题是,即使我在开始时设置了 t1 并在调用 draw 函数后立即设置了 t2,t2 也会在 QGraphicsView 实际更新之前返回。 (我知道,为什么这应该是异步的是有道理的)

例如,当我加载一个大文件时,它会在我减去这两个值后返回 700 毫秒,但实际渲染直到几秒钟后才完成。

我浏览了整个网络并搜索了 Qt 文档。我可以找到大量关于自己更新小部件的信息,但没有关于渲染完成后触发的任何类型的信号或事件的信息。

即使是 QGraphicsScene::changed 信号似乎也只是在下面的场景发生变化时才会触发,而不是在渲染完成并且用户可以看到变化时触发。

关于如何执行此操作的任何帮助?

最佳答案

Does a signal or event exist for when a QGraphicsView or QWidget is done being painted or rendered?

据我所知,它不存在。 (寻找类似的东西)

user can SEE the changes

据我所知,Qt使用双缓冲,所以如果绘制完成,并不意味着用户可以看到变化。

Any help on how to do this?

如果你想知道绘画什么时候完成,那么......

  1. 您可以继承 QGraphicsScene 并实现您自己的 drawItems、drawBackground 或 drawForeground。这并不简单(因为项目绘制算法很复杂),但是您将能够知道每个项目何时完成绘制。
  2. 您可以从 paintEvent(基于QWidget 的类)或 paint()(QGraphicsItem/QGraphicsObject基于 的类)。显然,您需要使用自己的类,并且您必须继承 QGraphicsView、您在 View 中绘制的项目或 QGraphicsScene。
  3. 您还可以创建代理 QPainter 类,这样您就可以知道正在绘制什么以及何时绘制。

话虽如此,我怀疑您未正确处理问题。

  1. 如果您只是想绘制图表,那么您没有理由知道绘画何时完成。
  2. 如果绘制完成,并不意味着用户可以看到结果。
  3. Paint 事件可能会被多次调用。

推荐方法:

使用线程或计时器事件从外部源接收/读取数据(您正在绘制图表)(显然,如果您使用计时器事件,则需要以小块读取数据),然后更新不时绘制图表,让 Qt 处理重新绘制。


How exactly does this allow me to detect the amount of time it takes from when I choose to open a file to when all the data is loaded and the graph is drawn and is visible?

  1. 您可以检测 paintEvent 何时完成绘制,方法是将您用于绘制 Graph 的任何小部件子​​类化、覆盖 paintEvent 并从 paintEvent 中触发信号、调用子例程或执行任何您想要的操作。
  2. 不保证 paintEvent 只会被调用一次。
  3. 要衡量单个例程的速度有多慢并找出瓶颈,请使用分析器。 VerySleepy、AQTime 等。
  4. 与其测量加载和显示数据所需的时间,不如分别测量加载时间和显示时间更有意义。这是一个 GUI 应用程序,而不是游戏引擎,因此您无法精确控制何时绘制某些内容。

关于c++ - 当 QGraphicsView 或 QWidget 完成绘制或渲染时是否存在信号或事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17448194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com