【发布时间】:2011-11-03 08:18:26
【问题描述】:
我遇到了一个奇怪的问题,小部件长时间无法重新绘制。
我有一个非 Qt 线程播放音频并根据音频播放位置定期向我的 GUI 线程发布自定义事件。 GUI 线程通过生成一些视觉反馈(例如,在小部件顶部显示标签)并在其自身上调用 repaint() 来做出反应。这在 Mac OSX 上运行良好,并且在我拥有的在 Windows(XP 和 7)上练习功能的单元测试应用程序中运行良好,但是,在 Windows XP/7 上的实际应用程序中,该小部件无法正确重绘,直到音频播放结束。
在 OSX 和我的单元测试中观察到的正确行为:
-> Custom Event
-> QEvent::Paint (12)
-> Custom Event
-> QEvent::Paint (12)
etc.
在我的实际应用中观察到错误行为:
-> Custom Event
-> QEvent::UpdateRequest (77)
-> Custom Event
-> QEvent::UpdateRequest (77)
etc.
-> QEvent::Paint (12)
我尝试了各种方法来强制进行重绘,例如 QCoreApplication::processEvents,但都无济于事。我还尝试将线程间事件作为罪魁祸首消除,并使用定期计时器从 GUI 线程轮询当前音频位置并更新小部件,但也没有太多运气。
任何关于如何进一步诊断的想法将不胜感激!
【问题讨论】:
-
你调用update()还是repaint()?
-
我已经尝试过更新和重绘。
-
可以在这里展示你的一些代码吗?也许只是 Windows 上的 main()?
-
不幸的是,问题是系统性的,当我将相关部分拉到独立的单元测试中时不会发生。线程在这里可能是一个问题。我相信音频线程的运行优先级高于 Qt GUI 线程。但是,这似乎并不能阻止接收自定义事件。