arn*_*rne 6 c++ qt qwidget qtableview
在Mint Linux 12上使用Qt4.8,我实现了一个包含QTableView
显示模型内容的简单窗口.模型数据不断更新(记录消息),并dataChanged()
定期发出信号(即每100ms).
我看到的问题是桌面上的视觉更新.
我在窗口上安装了一个事件过滤器来计算updateRequest
类型事件,这应该触发一个窗口小部件重绘(也可以在子窗口小部件上,即tableView
).它们之间的平均时间约为170毫秒,标准偏差约为90毫秒(我猜这是相当大的).然而,感知的视觉更新率仅为每秒两到三次,我想知道为什么.似乎并非所有updateRequest
事件都触发窗口小部件重绘或窗口系统吞下视觉更新.
作为第二次测试,我强制窗口通过调用repaint
或update
每100ms 更新自己.使用时repaint
,我看到了相应的updateRequest
类型事件增加和间隙标准差的减少; 用update
,数量没有增加.但是,在这两种情况下,感知更新率只有适度增加.
另外:有没有一个很好的方法来衡量一个小部件实际真正重新绘制的频率,而不必重载它的paintEvent
处理程序?也许来自QTest
哪里?
更新:我将事件过滤器扩展为catch paintEvent
-type事件.对于> 1000种updateRequest
类型的事件,只有一位数的数字.
您应该检测事件调度程序aboutToBlock()
和awake()
信号,并使用QElapsedTimer
. 当前线程的事件调度程序的实例由 static 返回QAbstractEventDispatcher::instance()
。
如果事件循环休眠的时间只占时间测量窗口的一小部分,则意味着 GUI 线程中正在进行太多操作。您可以记录事件循环休眠的时间,例如最后一秒。如果低于 10%,则可能会出现更新缓慢之类的情况。请记住,更新事件按 排队Qt::LowEventPriority
。它们将被标准排队信号和几乎所有其他事件抢占。