PyQt 玩轉 pyqtSignal 自定義信號,如何讓多頁面之間進行通信

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,索要源碼,一起學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章