gpt4 book ai didi

c++ - QWidget 更新事件但没有视觉更新

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:23 25 4
gpt4 key购买 nike

在 Mint Linux 12 上使用 Qt4.8,我实现了一个包含 QTableView 的简单窗口来显示模型的内容。模型数据不断更新(日志消息)并且 dataChanged() 信号定期(即每 100 毫秒)发出。

我看到的问题是桌面上的视觉更新时断断续续的。

我在窗口上安装了一个事件过滤器,用于计算 updateRequest 类型的事件,这应该会触发小部件重绘(也在子小部件上,即 tableView)。它们之间的平均时间约为 170 毫秒,标准偏差约为 90 毫秒(我猜这是相当大的)。但是,感知到的视觉更新速率每秒只有两到三倍,我想知道为什么。似乎并非所有 updateRequest 事件都会触发小部件重绘或窗口系统吞噬视觉更新。

作为第二个测试,我通过每 100 毫秒调用 repaintupdate 来强制窗口更新自身。使用 repaint,我看到 updateRequest 类型的事件相应增加,间隙的标准偏差减少;使用更新,数量没有增加。然而,在这两种情况下,感知更新率仅略有增加。

此外:是否有一种好的方法可以衡量一个小部件实际重绘的频率,而不必重载其 paintEvent 处理程序?也许来自 QTest


更新:我扩展了我的事件过滤器以捕获 paintEvent 类型的事件。与 > 1000 个 updateRequest 类型的事件相比,这些事件只有一位数。

最佳答案

您应该检测事件调度程序的 aboutToBlock()awake() 信号,并使用 QElapsedTimer 测量它们之间的时间。当前线程的事件调度程序实例由静态 QAbstractEventDispatcher::instance() 返回。

如果事件循环休眠时间测量窗口的一小部分,则意味着 GUI 线程中发生了太多事情。您可以计算事件循环在最后一秒休眠了多长时间。如果低于 10%,您可能会遇到更新缓慢等问题。请记住,更新事件使用 Qt::LowEventPriority 排队。它们将被标准排队信号和几乎所有其他事件抢占。

关于c++ - QWidget 更新事件但没有视觉更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10996890/

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