创建pyqtSignal数组

时间:2016-07-21 14:28:30

标签: python arrays qt5 pyqt5

对于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,它就可以了。 我究竟做错了什么?我在这里先向您的帮助表示感谢!

1 个答案:

答案 0 :(得分:0)

您无法创建pyqtSignal列表。

不幸的是,pyqt实现信号的方式使用了一些python魔法,pyqtSignal对象实际上被“转换”为pyqtBoundSignalQObject子类(技术上是一个具有{的类{1}}作为元类)被加载。

您可以通过不同方式解决问题:

1)包裹信号

我对此并不是百分之百确定,但它是您尝试的修改版本:

pyqtWrapperType

2)不要使用列表

如果信号的数量是固定的,只需将其直接创建为class FooWrap(QObject): Signal = QtCore.pyqtSignal(int) class MyThread(QtCore.QThread): Trigger = [FooWrap] * 10 signal1signal2,然后您就可以直接调用它们

如果您可以确定仅在运行时调用哪个信号,您可以使用gettattr(object, name)功能获取所需信号,例如:

signalN

getattr(self.MyQThread, 'signal' + str(n)).connect(self.update_text)

3)仅使用一个信号

仅使用一个发出两个值的信号,一个标识发出信号的“步骤”,第二个是您的值,这样连接的函数可以根据“步”值决定做什么。