在 Qt4 应用程序中,是否可以在paintEvent()
处理程序内部判断重绘是否由调整大小触发?
我有一个重绘非常慢的小部件(一个复杂的绘图),我想通过在调整小部件大小时只对调整大小的像素图进行blitting 来加快调整大小,并且仅在调整大小完成时重绘小部件。
我尝试在开头和结尾设置/取消设置标志,resizeEvent()
但这似乎不起作用(即标志总是在 中关闭paintEvent()
)。
我认为你不能轻易做到这一点。调整大小何时开始/停止有点难以判断,尤其是在跨平台的情况下。我可能会有一个由 触发的单次计时器resizeEvent
,它将图像渲染到QPixmap
. 如果您resizeEvent
在计时器仍处于活动状态时获得另一个,只需重新启动它。paintEvent
始终绘制当前像素图,并在从计时器渲染新像素图后,调用小update()
部件。不是一个理想的解决方案,但它应该工作。
您可以采取的一种方法是始终绘制像素图,但如果窗口大小发生变化,请记住“很快”重新创建像素图。
因此,当paintEvent 进入时,如果大小与当前像素图大小不同,则无论如何都要绘制存储的像素图,然后设置(或重置)QTimer以触发将刷新像素图的插槽的信号。
当此刷新方法运行时,它将重新渲染像素图并请求刷新小部件。
另一种可能性是看看QMdiSubWindow::RubberBandResize是如何在内部实现的,它可能会提供有关如何实现这一点的提示。如果我没记错的话,只能在 QMdiSubwindow 上工作 - 它在调整大小期间“停止”绘画(除了带有透明主体的小窗口边框),并在您停止调整窗口大小时触发一个最终的 resizeEvent (触发更新/绘画)......