【问题标题】:PySide2 Signal cannot receive QObject parameterPySide2 Signal 无法接收 QObject 参数
【发布时间】:2018-12-04 06:32:49
【问题描述】:

PySide2 我有一个自定义对象:

class ResizeEvent(QObject):
    def __init__(self, qresizeevent=None):
        ...

我希望子小部件在调整大小并且父小部件接收并处理此事件时发出信号。所以我在子小部件中定义了一个Signal,在父小部件中定义了一个Slot,并将它们连接起来:

class ChildWidget(QWidget):
    resized = Signal(ResizeEvent)

class ParentWidget(QWidget):
    @Slot(ResizeEvent)
    def onResized(self, event):
        print("onResized", event)
        ...
    ...
    def __init__(self):
        ...
        self.child.resized.connect(self.onResized)

这样每次调整子窗口小部件的大小时,父窗口小部件都会收到一个信号并打印出一个字符串“onResized”,然后是自定义事件对象。但是打印出来的事件对象是None,当然下面的代码会出错。如果我将一些int 参数而不是ResizeEvent 参数传递给信号,我得到了正确的参数。 QtCore.QResizeEvent 参数也是如此。

看来我的自定义对象无法成功通过信号槽连接。为什么会这样?我错过了什么吗?


此处提供了一个简化的可重现示例:

import sys
from PySide2.QtCore import QObject, Signal, Slot
from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton

class ResizeEvent(QObject):
    def __init__(self, qresizeevent=None):
        self.size = qresizeevent.size()
        self.oldSize = qresizeevent.oldSize()

class ChildWidget(QWidget):
    resized = Signal(ResizeEvent)
    def resizeEvent(self, event):
        super().resizeEvent(event)
        self.resized.emit(ResizeEvent(event))

class ParentWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.child = ChildWidget()
        self.child.setFixedSize(200,50)
        self.button = QPushButton("Increase Size")
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.child)
        self.layout.addWidget(self.button)
        self.setLayout(self.layout)
        self.child.resized.connect(self.onResized)
        self.button.clicked.connect(self.onClicked)
    @Slot(bool)
    def onClicked(self, checked):
        self.child.setFixedSize(self.child.width() + 10, self.child.height() + 10)
    @Slot(ResizeEvent)
    def onResized(self, event):
        print("onResized", event)

if __name__ == "__main__":
    app = QApplication()
    widget = ParentWidget()
    widget.show()
    sys.exit(app.exec_())

【问题讨论】:

  • @eyllanesc 感谢您的回复。我在我的问题中发布了一个最小的可重现示例。我不打算控制任何事件。我只想在小部件调整大小后做点什么。原因很复杂(如果您不感兴趣,请忽略它):起初我只是想在 QML 中捕获信号。但是我发现传入的QResizeEvent参数是undefined。所以我定义了我的自定义ResizeEvent 类并注册它并将其用作参数。但是现在参数是null。于是我在一个no-QML的例子里查了一下,发现参数还是None,即使在python中。
  • 如果您提供minimal reproducible example,您会看到解决问题的速度有多快,另一方面,在 QML 中不使用事件,但您使用的信号是 onHeightChanged、onWidthChanged。
  • @eyllanesc 你是对的。我会尝试一些更好的解决方案。再次感谢!

标签: python qt-signals pyside2


【解决方案1】:

当你继承时你必须调用你继承的类的构造函数:

class ResizeEvent(QObject):
    def __init__(self, qresizeevent=None):
        super(ResizeEvent, self).__init__() # <----
        self.size = qresizeevent.size()
        self.oldSize = qresizeevent.oldSize()

【讨论】:

  • 哦..没错。这么傻的问题。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2014-12-05
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多