在Mint Linux 12上使用Qt4.8,我实现了一个简单的窗口,包含一个QTableView来显示模型的内容。模型数据不断更新(日志消息),并且dataChanged()信号会定期发出(即每100ms)。
我看到的问题是表格上的视觉更新出现了卡顿。
我在窗口上安装了一个事件过滤器,用于计算updateRequest类型的事件数量,这应该会触发部件重绘(也包括子部件,即tableView)。这些事件之间的平均时间为约170毫秒,标准偏差为约90毫秒(我想这相当大)。然而,感知到的视觉更新速率只有每秒两三次,我想知道原因。似乎并不是所有的updateRequest事件都会触发部件重绘,或者窗口系统吞噬了视觉更新。
作为第二个测试,我强制窗口每100ms更新一次,方法是调用repaint或update。使用repaint,我看到updateRequest类型的事件数量相应增加,间隔的标准偏差减小;而使用update,则没有增加。但是,两种情况下感知到的更新速率只有适度增加。
此外:有没有一种好的方法可以测量部件实际上被重绘的频率,而不必超载其paintEvent处理程序?也许可以从QTest中找到一些方法?
更新:我扩展了我的事件过滤器,以便也捕获paintEvent类型的事件。其中只有个位数的这种事件,而updateRequest类型的事件则有超过1000个。
我看到的问题是表格上的视觉更新出现了卡顿。
我在窗口上安装了一个事件过滤器,用于计算updateRequest类型的事件数量,这应该会触发部件重绘(也包括子部件,即tableView)。这些事件之间的平均时间为约170毫秒,标准偏差为约90毫秒(我想这相当大)。然而,感知到的视觉更新速率只有每秒两三次,我想知道原因。似乎并不是所有的updateRequest事件都会触发部件重绘,或者窗口系统吞噬了视觉更新。
作为第二个测试,我强制窗口每100ms更新一次,方法是调用repaint或update。使用repaint,我看到updateRequest类型的事件数量相应增加,间隔的标准偏差减小;而使用update,则没有增加。但是,两种情况下感知到的更新速率只有适度增加。
此外:有没有一种好的方法可以测量部件实际上被重绘的频率,而不必超载其paintEvent处理程序?也许可以从QTest中找到一些方法?
更新:我扩展了我的事件过滤器,以便也捕获paintEvent类型的事件。其中只有个位数的这种事件,而updateRequest类型的事件则有超过1000个。