gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:33:22 26 4
gpt4 key购买 nike

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

具有组合的工作测试用例

实例化 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com