我想获取信号在线程(工作者)上发出的值,信号接受两个参数(两个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。有什么帮助吗?
您可能会认为使用括号会使您的信号带有一个奇异的参数签名,但事实并非如此。信号可以用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
函数将与以前的基于单参数的版本一起使用。