QWidget的更新事件,但没有视觉更新(QWidget update events but no

2019-09-18 01:24发布

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

我看到的问题是口吃在桌子上的视觉更新。

我安装计数窗口上的事件过滤器updateRequest型事件,它应该触发一个widget重绘(也子部件,即tableView )。 这些都与他们和90毫秒的〜个标准差之间170ms的〜的平均时间(这是相当大的,我猜)。 然而,感知的视觉更新率只有两三次,第二,我不知道为什么。 这似乎并不是所有的updateRequest事件触发控件重绘或窗口系统燕子视觉更新。

作为第二次测试,我强迫窗口通过调用来更新自身repaintupdate每100ms。 使用repaint ,我看到相应增加updateRequest型事件和空白的标准偏差的减少; 与update ,数量并没有增加。 然而,只有在两种情况下感知的更新速度的适度增长。

另外:有没有衡量多久一个小部件居然真的重新粉刷,而无需超载它的一个好方法paintEvent处理程序? 也许从什么QTest


更新:我伸出我的事件过滤器也搭上paintEvent型事件。 目前只有那些与> 1000的一个位数字updateRequest型事件。

Answer 1:

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

如果事件循环休眠的时间测量窗口的一个非常小的一部分,这意味着有太多的东西,在GUI线程回事。 你可以保持的事件循环睡了多久,比如说,在最后一秒的计数。 如果是低于10%,你可以期望更新速度慢和诸如此类的东西。 请记住,更新事件排队用Qt::LowEventPriority 。 他们将通过标准的队列信号和几乎所有其他事件被抢占。



Answer 2:

QApplication::compressEvent丢弃QEvent::UpdateRequest ,如果已经有一个未处理。 因此,即使重绘(S)可以立即返回,而不画,如果事件被丢弃。 您可以检查,如果你的updateRequest事件被改写丢弃compressEvent



文章来源: QWidget update events but no visual update