是否可以从基类继承信号并在派生类中将方法连接到它们?如果是,如何?
具有组合的工作测试用例
实例化 MyObject
在 MyWidget
,并在小部件中对对象发出的信号使用react。
from PySide.QtGui import QApplication, QMainWindow
from PySide.QtCore import QObject, QTimer, Signal
from PySide.QtGui import QLabel
class MyObject(QObject):
sig = Signal()
def __init__(self, parent=None):
super().__init__(parent)
QTimer.singleShot(3000, self.alert)
QTimer.singleShot(5000, self.exit)
def alert(self):
self.sig.emit()
def exit(self):
print('All done')
exit(0)
class MyWidget(QLabel):
def __init__(self, parent=None):
super().__init__(parent)
self.monitor = MyObject(self)
self.monitor.sig.connect(self.update)
def update(self):
print(2)
app = QApplication([])
w = MyWidget()
w.show()
app.exec_()
这是一个小而有效的示例,它打开一个最小的空窗口,
self.monitor
小部件实例化的对象在 3 秒和 5 秒后发出一个计时器信号。第一个提示小部件向控制台打印一个数字,第二个信号导致应用程序退出。带有继承的失败测试用例
对于继承,只有小部件类更改为:
class MyWidget(MyObject, QLabel):
def __init__(self, parent=None):
super().__init__(parent)
self.sig.connect(self.update)
def update(self):
print(2)
如果这在控制台中运行,则不会打印任何内容,但会发生段错误。
为什么?这可以挽救吗?
通过更换抢救
super()
有趣的是,如果两个类都改为不使用
super()
,该示例再次起作用:class MyObject(QObject):
sig = Signal()
def __init__(self, parent=None):
QObject.__init__(self, parent)
QTimer.singleShot(3000, self.alert)
QTimer.singleShot(5000, self.exit)
def alert(self):
self.sig.emit()
def exit(self):
print('All done')
exit(0)
class MyWidget(MyObject, QLabel):
def __init__(self, parent=None):
MyObject.__init__(self, parent)
QLabel.__init__(self, parent)
self.sig.connect(self.update)
def update(self):
print(2)
Generally I prefer to use
super()
,但也许我需要 reconsider ?我特意链接了两篇关于 super()
用法的有争议的文章。在 Python 中。现在会感兴趣如何使用super()
正确使用 pyside,或者解释为什么它在 pyside 中根本不起作用。次要更新:
使用继承和
super()
时但是删除所有与信号相关的代码,该示例的工作原理是它确实打开了窗口并且不会出现段错误。所以似乎有一些迹象表明 super()
的组合初始化和信号会导致问题。次要更新2:
..并在注释掉
self.sig.connect
时窗口启动并且仅在 5 秒信号触发以退出应用程序时才会出现段错误。(这是带有 CPython 3.3.1 解释器的 Ubuntu 13.04 系统上的 Qt 4.8.4、Pyside 1.1.2)
最佳答案
Qt 不支持 multiple inheritance from QObjects
,同样的限制适用于 PySide 和 PyQt。尽管有时有办法解决此限制,但尝试创建具有两个或更多 QObject
的子类通常是一个坏主意。基类。
对于信号的继承,使用简单的非QObject
mixin 可能是最好的方法——尽管我认为这个解决方案只适用于 PySide;对于 PyQt4,信号只能在 QObject
上定义子类。
更新 :
PyQt5 中删除了后一个限制:现在可以在不继承自 QObject
的类中定义属性、信号和槽。 .
关于python-3.x - 我们可以在 pyside 中发出基类的信号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19412844/