如何在没有中间绘制的情况下调整 QWidget 的大小
Posted
技术标签:
【中文标题】如何在没有中间绘制的情况下调整 QWidget 的大小【英文标题】:How to resize QWidget without intermediate paint 【发布时间】:2017-06-21 10:03:18 【问题描述】:在学习过程中,Qt遇到了这样一个问题。假设我在QMainWindow
上有一个QWidget
。如何确保当我在此 QMainWindow
上调整 QMainWindow
、QWidget
的大小时,在调整大小不会停止之前不会重新绘制内容。
是的,我看到了这个例子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 的大小的主要内容,如果未能解决你的问题,请参考以下文章