3

在 Qt4 应用程序中,是否可以在paintEvent()处理程序内部判断重绘是否由调整大小触发?

我有一个重绘非常慢的小部件(一个复杂的绘图),我想通过在调整小部件大小时只对调整大小的像素图进行blitting 来加快调整大小,并且仅在调整大小完成时重绘小部件。

我尝试在开头和结尾设置/取消设置标志,resizeEvent()但这似乎不起作用(即标志总是在 中关闭paintEvent())。

4

3 回答 3

5

我认为你不能轻易做到这一点。调整大小何时开始/停止有点难以判断,尤其是在跨平台的情况下。我可能会有一个由 触发的单次计时器resizeEvent,它将图像渲染到QPixmap. 如果您resizeEvent在计时器仍处于活动状态时获得另一个,只需重新启动它。paintEvent始终绘制当前像素图,并在从计时器渲染新像素图后,调用小update()部件。不是一个理想的解决方案,但它应该工作。

于 2009-10-05T16:11:04.633 回答
2

您可以采取的一种方法是始终绘制像素图,但如果窗口大小发生变化,请记住“很快”重新创建像素图。

因此,当paintEvent 进入时,如果大小与当前像素图大小不同,则无论如何都要绘制存储的像素图,然后设置(或重置)QTimer以触发将刷新像素图的插槽的信号。

当此刷新方法运行时,它将重新渲染像素图并请求刷新小部件。

于 2009-10-05T16:14:57.527 回答
1

另一种可能性是看看QMdiSubWindow::RubberBandResize是如何在内部实现的,它可能会提供有关如何实现这一点的提示。如果我没记错的话,只能在 QMdiSubwindow 上工作 - 它在调整大小期间“停止”绘画(除了带有透明主体的小窗口边框),并在您停止调整窗口大小时触发一个最终的 resizeEvent (触发更新/绘画)......

于 2009-10-15T21:02:14.487 回答