将一个信号从线程发出的变量发送到pyqt5中的主窗口?

问题描述 投票:0回答:1

我想获取信号在线程(工作者)上发出的值,信号接受两个参数(两个list,或者list和int)。它起作用了,信号接受2个参数。但是,当我尝试在主窗口中获取这两个列表的值时,我只会得到一个列表。那么如何从一个信号中获得主窗口中的两个列表呢?

class Worker(QThread):
    authResult = QtCore.pyqtSignal((list,list))
    def __init__(self):
       super(Worker, self).__init__()
       self.flag = True
       self.s="vide"
def run(self):
    self.auth()

def auth(self):
    c=0
    Malist=[]
    k=c+600
    while c<10:
        c+=1
        time.sleep(0.3)
        print(c)

        Malist.append(k)
        k=k+1

    Malist2=['a','b','c']
    self.authResult.emit( Malist,Malist2)

并且这是包含按钮的主窗口,我只想打印两个列表Malist和Malist2的值

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(300, 200))    
        self.setWindowTitle("PyQt button example ") 


        pybutton = QPushButton('Click me', self)
        pybutton.clicked.connect(self.clickMethod)
        pybutton.resize(100,32)
        pybutton.move(50, 50)


        pybutton2 = QPushButton('Afficher !!', self)
        pybutton2.clicked.connect(self.afficher)
        pybutton2.resize(60,32)
        pybutton2.move(160, 50)   

  def clickMethod(self):
    self.thread=Worker()
    self.thread.authResult.connect(self.handl)
    self.thread.start()
    print(self.thread.s)


  def handl(self,result):
    print(type(result))
    print(result)
    print("Cc!!")

结果是:[[600,601,602,603,604,605,606,607,608,609]仅显示列表1。有什么帮助吗?

python user-interface pyqt5 signals-slots qthread
1个回答
0
投票

您可能会认为使用括号会使您的信号带有一个奇异的参数签名,但事实并非如此。信号可以用multiple overloads声明(如“不同的参数签名”中所述),每个信号都包含在列表或元组之类的序列中。

所以,您所做的与以下内容完全相同:

authResult = QtCore.pyqtSignal([list, list])

这将与以下内容相同:

authResult = QtCore.pyqtSignal(list, list)

因为只有一个签名。

然后,您仅收到第一个列表,因为该函数仅接受一个参数。如果添加第二个参数,也会收到第二个列表:

    def handl(self, result, result2):
        print(type(result))
        print(result, result2)
        print("Cc!!")

# which will print:
<class 'list'>
[600, 601, 602, 603, 604, 605, 606, 607, 608, 609] ['a', 'b', 'c']
Cc!!

稍微不同的解决方案可能是使用单个object参数:

authResult = QtCore.pyqtSignal(object)

使用此,handl函数将与以前的基于单参数的版本一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.