【问题标题】:Qt widget failing to repaint under certain conditionsQt 小部件在某些情况下无法重绘
【发布时间】: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 线程。但是,这似乎并不能阻止接收自定义事件。

标签: c++ windows qt


【解决方案1】:

您是否尝试直接调用绘制事件处理程序?即paintEvent(NULL)?

【讨论】:

  • 好主意。我今晚试试。
  • 运气不好。直接调用paintEvent()似乎没有什么区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 2019-04-21
  • 1970-01-01
  • 2020-06-20
  • 2012-04-01
相关资源
最近更新 更多