在Qt4中,如何检查paintEvent是否被调整大小触发?
在Qt4应用程序中,是否有可能告诉paintEvent()
处理程序重绘是否由调整大小触发?在Qt4中,如何检查paintEvent是否被调整大小触发?
我有一个小部件是重绘(一个复杂的剧情)很慢,我想只是blit一个调整大小的像素图而小部件被调整,加快地调整大小,仅重画widget时调整大小做完了。
我试过在resizeEvent()
的开始和结尾设置/取消设置一个标志,但似乎不起作用(即该标志总是关闭在paintEvent()
)。
我不认为你可以轻松地做到这一点。调整开始/停止大小时很难说清楚,特别是以跨平台的方式。我可能会有一个由resizeEvent
触发的单次计时器,它会将图像渲染到QPixmap
。如果您在计时器仍处于活动状态时又收到另一个resizeEvent
,请重新启动计时器。在paintEvent
中始终绘制当前的像素图,并在您从定时器渲染新的像素图后,在小部件上调用update()
。不是一个理想的解决方案,但它应该工作。
您可以采取的一种方法是始终绘制像素图,但如果窗口大小发生变化,请记得尽快重新创建像素图。因此,当paintEvent进入时,如果大小与当前像素图大小不同,则仍然绘制存储的像素图,但是然后设置(或重置)QTimer以触发信号到插槽,该插槽将刷新像素图。
当此刷新方法运行时,它将重新渲染像素图并请求刷新窗口小部件。
另一种可能性是查看内部如何实现QMdiSubWindow::RubberBandResize,它可能会提供如何实现这一点的提示。如果我记得正确的话,只能在QMdiSubwindow上工作 - 在调整大小的过程中“停止”绘画(除了带有透明物体的小窗口边框)并在停止调整窗口大小时触发一个最终的resizeEvent(触发更新/绘制)...
谢谢,我实现了这样的东西,它似乎运作良好。如果鼠标左键关闭,我也重新启动计时器,所以如果您“暂停”调整大小,将不会触发重绘。 – 2009-10-05 18:31:55
好问题的好答案。 +1 – zaharpopov 2011-01-10 15:58:01