正在创建pyqtSignal的数组



对于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) 不使用列表

如果信号的数量是固定的,只需将它们直接创建为signal1signal2signalN,就可以直接调用

如果您可以确定只在运行时调用哪个信号,则可以使用gettattr(object, name)函数获得所需的信号,例如:

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

getattr(self.MyQThread, 'signal' + str(n)).emit(value)

3) 仅使用一个信号

只使用一个发出两个值的信号,一个确定发出信号的"步骤",第二个是您的值,这样连接的函数可以根据"步骤"值决定要做什么。

相关内容

  • 没有找到相关文章

最新更新