如何在没有中间绘制的情况下调整 QWidget 的大小

Posted

技术标签:

【中文标题】如何在没有中间绘制的情况下调整 QWidget 的大小【英文标题】:How to resize QWidget without intermediate paint 【发布时间】:2017-06-21 10:03:18 【问题描述】:

在学习过程中,Qt遇到了这样一个问题。假设我在QMainWindow 上有一个QWidget。如何确保当我在此 QMainWindow 上调整 QMainWindowQWidget 的大小时,在调整大小不会停止之前不会重新绘制内容。

是的,我看到了这个例子How to disable multiple auto-redrawing at resizing widgets in PyQt?

但是当我尝试这种方法时,它只是锁定了小部件内容。我只是想知道在我们调整MainWindow 的大小时是否可以确保QWidget 的内容没有改变。请告诉我,这可能吗?

非常感谢。

【问题讨论】:

如果您链接到的答案不是您想要的,那么您需要更详细地解释您想要什么。 好吧,当我们从链接中执行示例时,我们会遇到以下情况。当我们开始调整大小时,QWidget 中的内容只是隐藏,当我们停止调整主窗口大小时它会取消隐藏。所以,当我们调整 QMainWindow 的大小时,QWidget 的内容是不可见的,这是不好的。我只是想知道,可能有一种方法可以确保内容不会在调整大小时发生变化,并在我们完成调整大小时重新绘制 那么,当小部件调整大小时,您希望在小部件中看到什么? 可能类似于我们调整 QSplitters 的大小。我们开始调整大小,内容保持不变,完成后重新绘制。这可能吗? 【参考方案1】:

我仍然在猜测您到底想要什么,但听起来好像您本质上需要两种模式来为您的 paintEvent 方法提供两种模式 - 一种负责在大部分时间和一秒钟内渲染小部件的正常模式,轻量级的模式,可在调整小部件大小时使用。

如果是这种情况,那么您可以尝试以下方法...

#!/usr/bin/python3
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class widget(QWidget):
    def __init__(self):
        super().__init__()
        self.resize_timer = QTimer(self)
        self.resize_timer.setSingleShot(True)
        self.resize_timer.setInterval(100)
        self.resize_timer.timeout.connect(self.delayed_update)

    def delayed_update(self):
        self.update()

    def paintEvent(self, event):
        if self.resize_timer.isActive():
            print("painting deferred")

            # Your `lightweight' rendering goes here and will be used
            # while the widget is being resized.
        else:
            print("painting now")

            # Full rendering code goes here.

    def resizeEvent(self, event):
        super(widget, self).resizeEvent(event)
        self.resize_timer.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    f = widget()
    f.show()
    sys.exit(app.exec_())

请注意,它本质上只是对您链接到的答案中的代码进行简单修改。

【讨论】:

谢谢。我会试试看=)

以上是关于如何在没有中间绘制的情况下调整 QWidget 的大小的主要内容,如果未能解决你的问题,请参考以下文章

PyQT Python 错误 - 无法在没有 QApplication 的情况下创建 QWidget

由父级绘制 QWidget

如何在 QWidget 中绘制简单的水平线?

在 QWidget 上绘画以覆盖整个小部件

如何在没有窗口的情况下绘制文本

如何在 iOS 中在没有 UIImageView 的情况下在视图上绘制/绘制 UIIMage