首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PySide2信号不能接收QObject参数

PySide2信号不能接收QObject参数
EN

Stack Overflow用户
提问于 2018-12-04 06:32:49
回答 1查看 746关注 0票数 1

PySide2中,我有一个自定义对象:

代码语言:javascript
复制
class ResizeEvent(QObject):
    def __init__(self, qresizeevent=None):
        ...

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

代码语言:javascript
复制
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参数也是如此。

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

这里给出了一个简化的、可复制的例子:

代码语言:javascript
复制
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_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 07:00:11

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

代码语言:javascript
复制
class ResizeEvent(QObject):
    def __init__(self, qresizeevent=None):
        super(ResizeEvent, self).__init__() # <----
        self.size = qresizeevent.size()
        self.oldSize = qresizeevent.oldSize()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53606956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档