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