在Qt4中,如何检查paintEvent是否由resize触发?

3
在Qt4应用程序中,是否可以在paintEvent()处理程序内部告知重绘是由调整大小触发的还是其他原因引起的?
我有一个小部件,重新绘制速度非常慢(一个复杂的图),我想通过在调整大小时仅拷贝一个调整大小后的像素图像来加快调整大小的速度,并且只在调整大小完成后重新绘制小部件。
我尝试在resizeEvent()的开头和结尾设置/取消标志,但似乎不起作用(即在paintEvent()中该标志始终关闭)。
3个回答

5
我认为这并不容易。特别是在跨平台的情况下,很难确定调整大小何时开始/停止。我可能会使用由 resizeEvent 触发的单次定时器,将图像渲染到 QPixmap 上。如果在定时器仍然活动时收到另一个 resizeEvent ,只需重新启动它。在 paintEvent 中始终绘制当前的pixmap,并在从计时器渲染新的pixmap后调用 update()小部件。这不是理想的解决方案,但应该可以解决问题。

谢谢,我实现了类似的功能,看起来工作得很好。如果鼠标左键按下,我还会重新启动计时器,因此如果您“暂停”调整大小,它不会触发重绘。 - dF.

2

您可以采取的一种方法是始终绘制 pixmap,但是请记住如果窗口大小发生更改,要“尽快”重新创建 pixmap。

因此,当 paintEvent 发生时,如果大小与当前 pixmap 大小不同,则无论如何都要绘制存储的 pixmap,然后设置(或重置)QTimer 以触发一个信号到一个槽中,该槽将刷新 pixmap。

当此刷新方法运行时,它将重新呈现 pixmap 并请求刷新小部件。


1

另一种可能性是查看 QMdiSubWindow::RubberBandResize 在内部是如何实现的,这可能会提供如何实现此操作的提示。我记得只适用于 QMdiSubWindow - 它在调整大小期间“停止”绘制(除了带有透明背景的小窗口边框),并在停止调整窗口时触发一个最终的resizeEvent(触发更新/绘制)。...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接