Python PySide2信号无法接收QObject参数
在Python PySide2信号无法接收QObject参数,python,qt-signals,pyside2,Python,Qt Signals,Pyside2,在PySide2中,我有一个自定义的对象: class ResizeEvent(QObject): def __init__(self, qresizeevent=None): ... 我希望一个子小部件在调整大小并且父小部件接收并处理此事件时发出一个信号。因此,我在子窗口小部件中定义了一个信号,在父窗口小部件中定义了一个插槽,并将它们连接起来: class ChildWidget(QWidget): resized = Signal(ResizeEvent)
PySide2
中,我有一个自定义的对象:
class ResizeEvent(QObject):
def __init__(self, qresizeevent=None):
...
我希望一个子小部件在调整大小并且父小部件接收并处理此事件时发出一个信号。因此,我在子窗口小部件中定义了一个信号
,在父窗口小部件中定义了一个插槽
,并将它们连接起来:
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_())
继承时,必须调用继承的类的构造函数:
class ResizeEvent(QObject):
def __init__(self, qresizeevent=None):
super(ResizeEvent, self).__init__() # <----
self.size = qresizeevent.size()
self.oldSize = qresizeevent.oldSize()
类大小调整事件(QObject):
定义初始化(self,qresizeevent=None):
super(ResizeEvent,self)。_uinit__#()@eyllansc感谢您的回复。在我的问题中,我发布了一个最小的可复制示例。我不打算控制任何事件。我只想在小部件调整大小后做一些事情。原因很复杂(如果您不感兴趣,请忽略它):首先,我只想捕获QML中的信号。但是我发现传入的QResizeEvent
参数是undefined
。因此,我定义了我的自定义ResizeEvent
类,并将其注册并用作参数。但是现在参数是null
。因此,我在一个没有QML的示例中检查了它,发现即使在python中,该参数仍然是None
。您可以看到,如果您提供了一个参数,那么您可以以多快的速度解决问题。另一方面,在QML中,不使用事件,但您使用的信号是onHeightChanged、onWidthChanged。@eyllanesc您是对的。我会尝试一些更好的解决方案。再次感谢!哦这是正确的。这是个愚蠢的问题。非常感谢!