QWidget调整大小信号?

时间:2012-01-21 19:01:48

标签: qt qt4 pyqt pyqt4

我希望在调整窗口小部件时采取措施。

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

6 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:11)

如果你有任何其他QObject可以与该QWidget有严格的关系,你可以使用QObject::installEventFilter(QObject * filter)并重载bool eventFilter(QObject *, QEvent *)。请点击Qt docs

了解更多信息

答案 2 :(得分: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_())

答案 3 :(得分:4)

抱歉,它看起来像是黑客,但我用它:

    some_widget.resizeEvent = (lambda old_method: (lambda event: (self._on_resized(event), old_method(event))[-1]))(some_widget.resizeEvent)

答案 4 :(得分:2)

这已经太晚了几年,但我正在开发一个完全覆盖父级的透明覆盖小部件。如果没有子类化,你就无法做你想做的事,但你可以像@reclosedev建议的那样将子类限制为一个实例,这意味着你不必实际创建一个子类。

我编写了以下代码片段(在PyQt4中工作),用于跟踪添加窗口小部件的任何窗口小部件的大小:

class TransparentOverlay(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
        self._updateParent(self.parentWidget())

    def setParent(self, parent, *args):
        prevParent = self.parentWidget()
        super().setParent(parent, *args)
        self._updateParent(parent, prevParent)

    def unsetParent(self, parent=None):
        if parent is None:
            parent = self.parentWidget()
        if parent is not None and hasattr(parent.resizeEvent, '_original'):
            parent.resizeEvent = parent.resizeEvent._original

    def _updateParent(self, parent, prevParent=None):
        if parent is not prevParent:
            self.unsetParent(prevParent)
            if parent is not None:
                original = parent.resizeEvent
                def resizeEventWrapper(event):
                    original(event)
                    self.resize(event.size())
                resizeEventWrapper._original = original
                parent.resizeEvent = resizeEventWrapper
                self.resize(parent.size())

此代码使用Python可能提供的一些巧妙的技巧:

  • 原始方法隐藏在新方法的_original属性中。这是可能的,因为函数是对象。
  • 新方法确实是任何QWidget 实例的子类,这意味着您不必创建实际的子类。借助于on on方法,每个父实例将有效地成为子类的实例。

如果您需要一次性的东西,删除子类resizeEvent方法并将其替换为原始方法的所有代码都可以被删除。在这种情况下,该解决方案基本上是@ reclosedev解决方案的更高版本,但有@Chris关于保留原始地址的评论。

此代码唯一需要注意的是它不能正确支持GL小部件,因此例如,无法始终将叠加层添加到QGraphicsView的视口中。但是,它可以添加到QGraphicsView本身。

答案 5 :(得分:2)

您可以通过

覆盖resizeEvent
def resizeEvent(self, newSize):
    #do code here