在使用PyQT5做GUI桌面應用程序設計時,經常需要對在兩個界面之間做信號的傳遞,這個時候我們需要通過建立信號pyqtSignal 然后通過Connect 相應的槽函數來完成界面之間的數據傳遞。
1、pyqtSignal
通過pyqtSignal 可以聲明不帶參數和帶參數的實例對象,帶參數的實例對象可以聲明整形、字符型、列表、字典等數類型,具體如下:
from PyQt5.QtCore import QObject , pyqtSignal
#聲明無參數的信號
signal1 = pyqtSignal()
#聲明帶一個int類型參數的信號
signal2 = pyqtSignal(int)
#聲明帶int和str類型參數的信號
signal3 = pyqtSignal(int,str)
#聲明帶一個列表類型參數的信號
signal4 = pyqtSignal(list)
#聲明帶一個字典類型參數的信號
signal5 = pyqtSignal(dict)
#聲明一個多重載版本的信號,包括帶int和str類型參數的信號和帶str類型參數的信號
signal6 = pyqtSignal([int,str], [str])
對信號攜帶的數據類型做完相應的實例聲明后,通過emit的方式進行信號的發送,但是要根據你聲明的信號類型,emit中做相應類型數據的發送
signal1.emit()
signal2.emit(1)
signal3.emit(1,"text")
signal4.emit([1,2,3,4])
signal5.emit({"name":"wangwu","age":"25"})
signal6[int,str].emit(1,"text")
pyqtSignal 實例對象通過connent 對應函數的方式 ,將信號與槽函數做綁定處理
signal1.connetc(signalCall1)
def signalCall1():
pass
具體2個界面之間的信號傳遞如下:
class Form1(): signal_1 = pyqtSignal(str) #主界面的信號用來綁定子界面類的函數方法 def __init__(self, num=10): #創建form2的對象 self.num = num self.form2 = Form2() #實例化子界面類 #將自己的信號和Form2的接受函數綁定 self.signal_1.connect(self.form2.get_data) #通過按鍵打開from2 self.pushButton.clicked.connect(self.open_form2()) def open_form2(self): #傳遞信號 self.form2.show() #通過pushbutton 展示子界面 如果只是做數據的傳遞,不打開第二個界面,可以 不調用self.form2.show() 方法 #向form2發送信號,將self.num發了出去 self.signal_1.emit(self.num) #通過自己的信號向子界面傳遞數據。要想多傳遞幾個值,就在emit(值1,值2) 對應到子界面get_data接受就是2個參數,即get_data(值1,值2) #將form2的信號_singal_2和主界面的getData_F2連接 self.form2.signal_2.connect(self.getData_F2) def getData_F2(self,num2): #用於接收Form2發過來的數據 self.num2 = num2 # num2 就是子界面傳遞過來的數據 class Form2(): #子界面類 signal_2 = pyqtSignal(str) #子界面類創建信號用來綁定主界面類的函數方法 def __init__(self,num2=20): self.num2 = num2 def get_data(self,num): #接受Form1傳過來的num,保存到自己的變量里面。 self.num = num #子界面通過signal_2 向主界面傳遞數據 signal_2.emit(self.num2)
