gpt4 book ai didi

python - 使用 PyQt,监 window 口大小和调整布局的首选(有效)方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 01:15:13 28 4
gpt4 key购买 nike

我在 PyQt 中有一个项目网格,当用户修改窗口大小时,我需要相应地增加/减少列数。行数由滚动区域处理,因此我无需担心 y 方向的变化(如果这很重要)。

在我的 QMainWindow 实现中,我知道可以覆盖 resizeEvent() 函数,该函数将在任何和所有窗口调整时触发。然而,每次都用它来重建网格是非常低效的。只是为了测试函数以查看它是如何工作的,我让 resizeEvent 仅打印一个字符串,这导致我的窗口调整略微滞后并且视觉上不完美(抖动而不是平滑)。我可能会在窗口大小上运行一个简单的除法运算,看看它是否变大或变小到足以改变列数,但即便如此,当每次调整运行一百次时,也可能会导致滞后问题。重建整个网格甚至可能需要一秒钟的时间,因此最好不要在用户操作窗口时需要这样做。

是否有更有效的方法,或者 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_())

关于python - 使用 PyQt,监 window 口大小和调整布局的首选(有效)方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305464/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com