【问题标题】:Creating an array of pyqtSignal创建一个 pyqtSignal 数组
【发布时间】:2016-07-21 14:28:30
【问题描述】:

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

【问题讨论】:

  • 还建立了一个 Wrap 函数: class FooWrap(): Signal = QtCore.pyqtSignal(int) Then class MyThread(QtCore.QThread): Trigger = [FooWrap] * 10 and later on self.MyQThread .Trigger[0].Signal.connect(self.update_text) 导致同样的错误...
  • 为什么要这样做?听起来有点像 XY 问题……
  • 因为我要设置一个类,它可以有很多pyqtSignals。在少数情况下,我需要多个信号,因为在代码的不同步骤中会出现不同的信号。
  • @three_pineapples :提供更多细节:我正在为我正在攻读博士学位的物理实验开发一个新的 gui。我想从异步线程中连续禁用、启用按钮和更新 gui。
  • 酷(我也在攻读物理学博士学位!)。我建议您在下面的答案中选择选项 3。只需使用一个信号并发出一个参数列表,让您的插槽确定要做什么。

标签: python arrays qt5 pyqt5


【解决方案1】:

您不能创建 pyqtSignal(s) 列表。

不幸的是,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) 只使用一个信号

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多