PyQt pyqtSignal 自定義信號實例講解,多頁面信息傳遞
個人認爲pyqtSignal是pyqt裏非常實用的一個接口,是 PyQt5 提供的自定義信號類; 其用法比較靈活,特別適合用於多頁面之間的信號,信息傳遞,其繼承自QtCore類。
基本用法:
信號傳遞方法:可以傳遞的信息,可以說是基本上覆蓋了Python的所有數據類型。
pyqtSignal(str) # 傳遞字符串數據
pyqtSignal(list) # 傳遞列表數據
pyqtSignal(tuple) # 傳遞元祖數據
pyqtSignal(dict) # 傳遞字典數據
其用法可歸納爲:
1、定義信號 diy_signal = pyqtSignal(str);
2、信號激發:diy_signal.emit(需傳遞的數據);
3、接收信號:diy_signal.connect(激發的槽函數)。
可以看出pyqtSignal和pyqt的信號與槽用法非常類似。
都有信號的激發,信號與槽函數的鏈接過程。如:QPushButton().clicked.connect(click_func)。
只不過其信號相對於按鈕的點擊而言,爲自定義信號。
實例用法:
我們先來試着用pyqtsignal信號來完成以下的需求:
有兩個父子頁面,當子頁面被創建和關閉時,父頁面顯示子頁面狀態信息。
完成最終效果:
先創建父頁面類:
# 導入模塊
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt,pyqtSignal
from PyQt5.QtGui import QFont
# 創建父頁面類
class Parents_Widget(QWidget):
def __init__(self):
super(Parents_Widget, self).__init__()
# 頁面基礎設置
# 設置窗口標題
self.setWindowTitle('父頁面')
# 設置頁面尺寸
self.resize(500,200)
# 創建Label控件
# 頁面標題label
self.label_0 = QLabel('頁面間信號傳遞實例')
# 設置label控件居中
self.label_0.setAlignment(Qt.AlignCenter)
# 設置字體樣式
self.label_0.setFont(QFont('宋體',12,QFont.Bold))
self.label_1 = QLabel('子頁面狀態:')
# 創建單行文本輸入框
self.line_1 = QLineEdit()
# 創建按鈕
self.create_button = QPushButton('創建子頁面')
self.close_button = QPushButton('關閉子頁面')
# 按鈕初始方法
self.button_init()
# 創建佈局管理器
self.h1_layout = QHBoxLayout() # 水平佈局管理器
self.h2_layout = QHBoxLayout()
self.v_layout = QVBoxLayout() # 垂直佈局管理器
# 頁面初始化
self.layout_init()
# 頁面佈局方法
def layout_init(self):
# 水平佈局管理器1
self.h1_layout.addWidget(self.label_1)
self.h1_layout.addWidget(self.line_1)
# 水平佈局管理器2
self.h2_layout.addWidget(self.create_button)
self.h2_layout.addWidget(self.close_button)
# 垂直佈局管理器
self.v_layout.addStretch(1)
self.v_layout.addWidget(self.label_0)
self.v_layout.addSpacing(10)
self.v_layout.addLayout(self.h1_layout)
self.v_layout.addSpacing(10)
self.v_layout.addLayout(self.h2_layout)
self.v_layout.addStretch(1)
# 設置最終佈局
self.setLayout(self.v_layout)
# 按鈕初始化方法
def button_init(self):
# 創建子頁面按鈕點擊信號綁定槽函數
self.create_button.clicked.connect(self.create_func)
# 關閉子頁面按鈕點擊信號綁定槽函數
self.close_button.clicked.connect(self.close_func)
# 創建子頁面方法
def create_func(self):
# 創建子頁面
self.child_widget = Child_Widget()
# 子頁面自定義信號綁定顯示子頁面信息方法
self.child_widget.status_signal.connect(
self.child_widget_info)
# 設置子頁面名稱
self.child_widget.setWindowTitle('子頁面')
self.child_widget.show()
# 子頁面關閉方法
def close_func(self):
try:
self.child_widget.close()
self.child_widget.status_signal.connect(self.child_widget_info)
except:
self.line_1.setText('子頁面不存在!')
# 子頁面信息顯示方法
def child_widget_info(self,info):
if info == 'create':
self.line_1.setText('子頁面被創建')
elif info == 'close':
self.line_1.setText('子頁面被關閉')
代碼分析:
1、父頁面有兩個按鈕:創建子頁面按鈕,關閉子頁面按鈕。
2、兩個按鈕點擊信號分別綁定創建頁面槽函數,關閉子頁面槽函數。
3、創建子頁面槽函數,創建了子頁面,並將子頁面的自定義信號status_signal綁定在子頁面信息顯示方法。當子頁面自定義信號激發(emit)時激活子頁面信息顯示槽函數。
4、關閉子頁面槽函數,關閉子頁面。
創建子頁面類:
# 創建子頁面類
class Child_Widget(QWidget):
# 創建自定義子頁面狀態信號
status_signal = pyqtSignal(str)
def __init__(self):
super(Child_Widget, self).__init__()
# 設定子頁面尺寸
self.resize(300,300)
# 設定子頁面的窗口名稱改變信號與自定義信號連接
self.windowTitleChanged.connect(lambda :
self.status_signal.emit('create'))
# 重寫關閉方法,將子頁面關閉事件與自定義信號連接
def closeEvent(self, event):
self.status_signal.emit('close')
代碼分析:
1、自定義信號:status_signal ,其傳輸的信息類型爲字符串。
2、子頁面狀態有創建和關閉兩種狀態,創建狀態用子頁面標題改變信號來綁定自定義信號。
即:子頁面標題從無到有時,自定義信號被激發(emit),並傳遞 ‘create’ 字符串信息。
3、子頁面關閉狀態,這裏是重寫了頁面關閉方法。讓頁面關閉事件綁定自定義信號,當頁面關閉時激發信號,並傳遞 ‘close’ 字符串信號。
實例父頁面類,及展示窗口:
if __name__ == '__main__':
page = QApplication(sys.argv)
# 實例父頁面
window = Parents_Widget()
window.show()
sys.exit(page.exec())
結尾:
以上就是本次 pyqt5 使用自定義信號 pyqtSignal 來進行頁面之間的信息傳遞的方法及實例講解。
因本人Python 及 pyqt5 均爲視頻或者書籍自學,路子可能比較野…。
有講的不清楚,或者錯誤之處,歡迎大家留言討論。也可加本人微信:dw20200318,索要源碼,一起學習。