Сигнал PySide2 не может получить параметр QObject - PullRequest
0 голосов
/ 04 декабря 2018

В 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_())

1 Ответ

0 голосов
/ 04 декабря 2018

Когда вы наследуете, вы должны вызвать конструктор класса, который вы наследуете:

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