use*_*381 6 python qt qt4 pyqt pyqt5
我在PyQt中有一个项目网格,当用户修改窗口大小时,我需要相应地增加/减少列数。行数由滚动区域处理,因此我不必担心y方向的变化(如果这样的话)。
在我的QMainWindow实现内部,我知道可以覆盖resizeEvent()函数,该函数将针对所有窗口调整触发。但是,每次使用它来重建网格效率都非常低。只是为了测试该函数以了解其工作原理,我让resizeEvent仅打印了一个字符串,这导致我的窗口调整有些滞后并且在视觉上不完美(抖动而不是平滑)。我可能会对窗口大小运行一个简单的除法运算,以查看它是否变得足够大或更小以更改列数,但是即使这样,当每次调整运行100次时,也可能会导致滞后问题。重建整个网格甚至可能需要花费一秒钟的时间,因此最好不要这样做,因为用户正在操作窗口。
有没有一种更有效的方法,还是resizeEvent是我唯一的选择?理想情况下,我希望事件仅在用户完成调整窗口后才触发,而不是触发几乎每一个像素移动发生的事件(每次调整可能在1秒的时间里发生数百或数千次) 。
我正在使用PyQt5,但是如果您对PyQt4更加熟悉,我可以在PyQt5的背景下找出您的PyQt4解决方案。与C ++ Qt4 / 5解决方案相同。
看起来唯一真正的问题是检测大小调整完成的时间。只要对此进行仔细控制,就可以按照您喜欢的任何方式进行实际布局。
下面是一个使用计时器控制何时发送完成调整大小的信号的解决方案。它看起来似乎并不笨拙,但是我还没有用任何复杂的布局对其进行测试(不过应该可以)。
from PyQt4 import QtCore, QtGui
class Window(QtGui.QWidget):
resizeCompleted = QtCore.pyqtSignal()
def __init__(self):
QtGui.QWidget.__init__(self)
self._resize_timer = None
self.resizeCompleted.connect(self.handleResizeCompleted)
def updateResizeTimer(self, interval=None):
if self._resize_timer is not None:
self.killTimer(self._resize_timer)
if interval is not None:
self._resize_timer = self.startTimer(interval)
else:
self._resize_timer = None
def resizeEvent(self, event):
self.updateResizeTimer(300)
def timerEvent(self, event):
if event.timerId() == self._resize_timer:
self.updateResizeTimer()
self.resizeCompleted.emit()
def handleResizeCompleted(self):
print('resize complete')
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 300, 300, 300)
window.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)