作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有小部件的 PyQt4 程序,其内容重绘非常缓慢(没关系,因为我的任务)。当我尝试调整这些小部件的大小时,程序会在未释放鼠标的情况下尝试重绘很多次。这是很多卡住。
我想禁用自动重绘并配置 PyQt 以仅在释放鼠标时重绘所有小部件(这意味着每次调整大小都会重绘一次)。
怎么做?
编辑1。 我会很简单地看到它,就像这样:你拖动线,当你拖动时,所有小部件都会站立。当您释放它时,小部件会重新绘制。但我真的不确定在 PyQt4 中是否可行。
最佳答案
首先,我建议确保如果您在小部件中使用自定义绘制事件,您不会在每个事件中做太多工作,而只是寻找创可贴解决方案。如果是这种情况,请尝试找到一种方法来缓存或减少工作量。除此以外...
是否绘制不透明是由您平台的窗口管理器做出的决定。据我所知,没有一个简单的属性来切换这个功能。类似的东西存在于 QSplitter
上只有在释放 handle 后才能绘制。
我可以提供一种解决方法,即延迟更新,直到一段时间内没有调整大小。这将为您的应用程序提供一些喘息空间以减少绘画事件。
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_()
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)
DelayedUpdater
监视目标小部件的调整大小事件,并执行延迟更新。您可以扩展
eventFilter
还要注意其他事件,例如移动。
关于performance - 如何在 PyQt 中调整小部件大小时禁用多次自动重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13552345/
我是一名优秀的程序员,十分优秀!