python-3.x - 我们可以在 pyside 中发出基类的信号吗?

标签 python-3.x pyside signals-slots super

是否可以从基类继承信号并在派生类中将方法连接到它们?如果是,如何?

具有组合的工作测试用例

实例化 MyObjectMyWidget ,并在小部件中对对象发出的信号使用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/

相关文章:

python - 如何在 python 中导入 Tensorflow 库?

javascript - 如何在 React Native 应用程序中使用 python 代码?

python - 为什么需要 processEvents() 才能让 QThread 工作?

C++ - 对`vtable(构造函数)的 undefined reference

python - PyQT 与 PyObjc/Cocoa-Python 对比

python - Gensim Word2Vec 模型 : Cut dimensions

python - Pyinstaller 在创建 exe 文件时无法导入 pylsd

python - 在pyside中设置应用程序名称

python - 基于 QTextEdit 的编辑器中更大的 CSS 字体大小

signals-slots - TYPO3 Extbase - 如何使用核心信号/插槽