首先,我建议确保如果您正在使用自定义绘图事件与您的小部件,则不要在每个事件中执行过重的工作,并寻找一种缓存或减少工作量的方法,而不是简单地寻找一个临时解决方案。否则...
绘制不透明或不绘制是由平台的窗口管理器决定的。据我所知,没有一个简单的属性可以切换此功能。类似于这样的东西存在于
QSplitter
上,只有在释放手柄后才进行绘制。
我可以提供一种变通的方法,即将更新延迟到一段时间内未发生大小调整之后。这将为您的应用程序提供一些空间来减少绘图事件。
from PyQt4 import QtCore, QtGui
import sys
class DelayedUpdater(QtGui.QWidget):
def __init__(self):
super(DelayedUpdater, self).__init__()
self.layout = QtGui.QVBoxLayout(self)
self.label = QtGui.QLabel("Some Text")
self.layout.addWidget(self.label, QtCore.Qt.AlignCenter)
self.delayEnabled = False
self.delayTimeout = 100
self._resizeTimer = QtCore.QTimer(self)
self._resizeTimer.timeout.connect(self._delayedUpdate)
def resizeEvent(self, event):
if self.delayEnabled:
self._resizeTimer.start(self.delayTimeout)
self.setUpdatesEnabled(False)
super(DelayedUpdater, self).resizeEvent(event)
def _delayedUpdate(self):
print "Performing actual update"
self._resizeTimer.stop()
self.setUpdatesEnabled(True)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
win = QtGui.QMainWindow()
view = DelayedUpdater()
win.setCentralWidget(view)
win.show()
view.delayEnabled = True
app.exec_()
您会注意到,当您快速调整主窗口大小时,自定义小部件没有更新,因为我们在调整大小事件中将其关闭了。一个QTimer正在尝试每100毫秒执行更新并停止自身。但每次发生另一个调整大小事件时,它都会重新启动计时器。效果是计时器将继续被重置,禁用更新,直到出现延迟。
尝试按住鼠标,稍微调整大小,等待一下,然后再调整大小。即使您的鼠标按下但未调整大小,更新也应该发生。调整延迟以适合您的需要。您可以使用布尔标志控制打开或关闭该功能。
此示例还可以重新设计,使
DelayedUpdater
成为QObject,接受某个QWidget实例作为参数。然后它将自己设置为该对象的
eventFilter
并监视其
resizeEvent
。这样,您不必为添加此内容而对常规小部件进行子类化。您只需创建一个
DelayedUpdater
实例并将其用作实用程序对象来监视小部件即可。
以下是将其制作为辅助对象的示例:
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.someWidget = QtGui.QWidget()
self.setCentralWidget(self.someWidget)
self.layout = QtGui.QVBoxLayout(self.someWidget)
self.label = QtGui.QLabel("Some Text")
self.layout.addWidget(self.label, QtCore.Qt.AlignCenter)
self.delayer = DelayedUpdater(self.someWidget)
class DelayedUpdater(QtCore.QObject):
def __init__(self, target, parent=None):
super(DelayedUpdater, self).__init__(parent)
self.target = target
target.installEventFilter(self)
self.delayEnabled = True
self.delayTimeout = 100
self._resizeTimer = QtCore.QTimer()
self._resizeTimer.timeout.connect(self._delayedUpdate)
def eventFilter(self, obj, event):
if self.delayEnabled and obj is self.target:
if event.type() == event.Resize:
self._resizeTimer.start(self.delayTimeout)
self.target.setUpdatesEnabled(False)
return False
def _delayedUpdate(self):
print "Performing actual update"
self._resizeTimer.stop()
self.target.setUpdatesEnabled(True)
请注意,我们仅在主窗口中的某个任意小部件上使用它。我们使用以下代码将延迟更新器添加到该小部件中:
self.delayer = DelayedUpdater(self.someWidget)
< p >
DelayedUpdater
监听目标小部件的大小调整事件,并执行延迟更新。您可以扩展
eventFilter
以同时监视其他事件,例如移动。