对于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,它就可以了。 我究竟做错了什么?我在这里先向您的帮助表示感谢!
答案 0 :(得分:0)
您无法创建pyqtSignal列表。
不幸的是,pyqt实现信号的方式使用了一些python魔法,pyqtSignal
对象实际上被“转换”为pyqtBoundSignal
当QObject
子类(技术上是一个具有{的类{1}}作为元类)被加载。
您可以通过不同方式解决问题:
我对此并不是百分之百确定,但它是您尝试的修改版本:
pyqtWrapperType
如果信号的数量是固定的,只需将其直接创建为class FooWrap(QObject):
Signal = QtCore.pyqtSignal(int)
class MyThread(QtCore.QThread):
Trigger = [FooWrap] * 10
,signal1
,signal2
,然后您就可以直接调用它们
如果您可以确定仅在运行时调用哪个信号,您可以使用gettattr(object, name)
功能获取所需信号,例如:
signalN
和
getattr(self.MyQThread, 'signal' + str(n)).connect(self.update_text)
仅使用一个发出两个值的信号,一个标识发出信号的“步骤”,第二个是您的值,这样连接的函数可以根据“步”值决定做什么。