对于QThread,我想创建一个pyqtSignal 数组
class MyThread(QtCore.QThread):
Trigger = []
for i in range(0,10):
Trigger.append(QtCore.pyqtSignal(int))
def __init__(self, Function):
self.Function = Function
super(MyThread, self).__init__(None)
def run(self):
self.Function()
以下代码的主要部分看起来像:
class Main(QtWidgets.QMainWindow):
def __init__(self):
self.MyQThread = MyThread(lambda: self.PrintTest(5))
def StartTestThread(self):
self.MyQThread.Trigger[0].connect(self.update_text)
self.MyQThread.start()
def PrintTest(self,InputValue):
for i in range (0,100):
print(InputValue*i)
time.sleep(0.2)
self.MyQThread.Trigger[0].emit(5)
def update_text(self, thread_no):
self.ui.MY_LISTWIDGET.addItem('123')
执行StartTestThread会导致以下错误
AttributeError:"PyQt5.QtCore.pyqtSignal"对象没有属性"连接"
如果我在不作为数组的情况下初始化pyqtSignal,它就会工作。我做错了什么?感谢您的提前帮助!
您不能创建pyqtSignal的列表。
不幸的是,pyqt实现信号的方式使用了一些python魔法,当加载QObject
子类(从技术上讲,是一个将pyqtWrapperType
作为元类的类)时,pyqtSignal
对象实际上被"转换"为pyqtBoundSignal
。
你可以用不同的方式解决你的问题:
1) 包裹信号
我不能100%确定,但这是你尝试的修改版本:
class FooWrap(QObject):
Signal = QtCore.pyqtSignal(int)
class MyThread(QtCore.QThread):
Trigger = [FooWrap] * 10
2) 不使用列表
如果信号的数量是固定的,只需将它们直接创建为signal1
、signal2
、signalN
,就可以直接调用
如果您可以确定只在运行时调用哪个信号,则可以使用gettattr(object, name)
函数获得所需的信号,例如:
getattr(self.MyQThread, 'signal' + str(n)).connect(self.update_text)
和
getattr(self.MyQThread, 'signal' + str(n)).emit(value)
3) 仅使用一个信号
只使用一个发出两个值的信号,一个确定发出信号的"步骤",第二个是您的值,这样连接的函数可以根据"步骤"值决定要做什么。