【发布时间】:2021-01-01 13:52:45
【问题描述】:
在 Qt 中,我们可以通过将它们设为静态变量来创建自定义信号。然后我们使用self.signame 而不是classname.signame。
这样就在类中创建了一个实例变量。
我想知道这种模式之外的理论。
这是我尝试过的一些伪代码,大多数来源都记录了这些伪代码:
from PyQt5 import QtWidgets,QtCore
class test(QtWidgets.QApplication):
sig=QtCore.pyqtSignal([bool])
def __init__(self):
super().__init__([])
# self.sig=QtCore.pyqtSignal([bool]) #1
self.window=QtWidgets.QWidget()
self.sig.connect(lambda x=True:print('Hello World'))
self.bt=QtWidgets.QPushButton(self.window,text='test',clicked=self.sig)
self.window.setLayout(QtWidgets.QVBoxLayout())
self.window.layout().addWidget(self.bt)
self.window.show()
test().exec()
当我想访问信号 test.sig 而不是 self.sig 时,
from PyQt5 import QtWidgets,QtCore
class test(QtWidgets.QApplication):
def __init__(self):
super().__init__([])
self.sig=QtCore.pyqtSignal([bool])
self.window=QtWidgets.QWidget()
self.sig.connect(lambda x=True:print('Hello World'))
self.bt=QtWidgets.QPushButton(self.window,text='test',clicked=self.sig)
self.window.setLayout(QtWidgets.QVBoxLayout())
self.window.layout().addWidget(self.bt)
self.window.show()
test().exec()
我得到这个错误:
test.sig.connect(lambda x=True:print('Hello World'))
AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
当我尝试将信号作为实例变量而不是静态变量时,我得到了那个错误(在伪代码中取消注释 #1)
我得到了同样的错误(和以前一样)。
我想知道这背后的原因吗
来源:PyQt5
【问题讨论】:
-
我已经编辑了一点。估计现在还好。
-
我已经使用了这段代码,我没有遇到任何问题。注意:错误信息永远不会和你提供的代码匹配,你确定这个错误信息是用你提供的代码得到的吗?
-
给定的伪代码没有任何错误,但是如果我们通过取消注释 #1 并删除静态变量来进行一些修改,我们会得到错误。我将添加更多代码
-
mmm,既然PyQt明明不推荐,为什么还要把信号声明为属性呢?