python - PySide2 Signal 无法接收 QObject 参数
问题描述
在PySide2
我有一个自定义对象:
class ResizeEvent(QObject):
def __init__(self, qresizeevent=None):
...
我希望子小部件在调整大小并且父小部件接收并处理此事件时发出信号。所以我Signal
在子小部件中定义了 a Slot
,在父小部件中定义了 a ,并将它们连接起来:
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()
推荐阅读
- pytest - Pytest 忽略 pytest.ini 文件
- reactjs - 基于使用唯一 ID 搜索的渲染值 - ReactJS
- validation - 如何让 Keycloak 验证用户同意?
- jenkins - Jenkins 多分支管道项目与管道项目
- youtube-api - YouTube 数据 API 因“accessNotConfigured”错误而停止工作
- angular - 如何在Angular中缩短文件路径?
- wget - Wget converting links differently on different environments
- python - Is there way to call task within the task in Airflow?
- reporting-services - SQL Server reporting services version issue
- c# - How to get session value in the custom class library in Core MVC application