QWidget调整大小信号?

war*_*iuc 23 qt qt4 pyqt pyqt4

我想在调整小部件大小时采取行动.

有没有办法在没有在该窗口小部件上安装事件过滤器的情况下捕获它(显然,没有子类化它)?AFAIK,QWidget没有resized信号.

Lol*_*4t0 24

您可以从widget类和重新实现resizeEvent事件派生

  • 我不会删除答案,我认为对于能够搜索这个问题的人来说这可能是有用的 (12认同)
  • 请注意,warwaruk 写道“并且,显然,没有将其子类化” (2认同)
  • 我没有说出任何关于删除答案的内容 (2认同)

Kam*_*mek 12

如果你有任何其他QObject可以与该QWidget有严格的关系,你可以使用QObject::installEventFilter(QObject * filter)和重载bool eventFilter(QObject *, QEvent *).在Qt docs上查看更多内容


rec*_*dev 9

如果您使用Python与PyQt4,您可以设置widget.resizeEvent为您的功能,而无需对其进行子类化:

#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui

def onResize(event):
    print event

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    widget = QtGui.QPushButton('Test')
    widget.resizeEvent = onResize
    widget.resize(640, 480)
    widget.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

  • 这可以防止resizeEvent的基类实现运行.它可能正在做一些重要的事情.使用monkey-patch解决方案,您必须将原始方法的引用保持为单独的变量.乱. (6认同)
  • @Chris文档说,当resizeEvent被调用时,widget已经有了它的新几何体,因此如果你在主要的widget上没有任何其他功能,你可以覆盖它.我使用这种技术来调整QScrollArea的内容. (2认同)

Vla*_*nko 6

对不起,它看起来像一个黑客,但我用这个:

    some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent)
Run Code Online (Sandbox Code Playgroud)

  • 对于为易读性而设计的 Python 来说就这么多了。但是,+1 用于保留超级实现。 (4认同)