官术网_书友最值得收藏!

1.4.6 自定義信號

在PyQt中,各個控件內置的信號已經能夠讓我們實現許多功能需求,但是如果想要更加個性化的功能,我們還得借助自定義信號來實現。本小節會詳細介紹如何自定義信號,并通過自定義信號進行傳值。

本小節的知識點相對于之前的部分要稍微難一些,如果對前面的信號和槽知識點還不是很熟悉,可以先跳過這一部分,等可以熟練地連接信號和槽后再來看。

1.創建自定義信號

自定義信號是通過pyqtSignal來創建的,接下來通過示例代碼1-19來演示自定義信號的創建過程。

示例代碼1-19

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import*
 
class Window(QWidget):
    my_signal = pyqtSignal()                   # 1
 
    def __init__(self):
        super(Window, self).__init__()
        self.my_signal.connect(self.my_slot)   # 2
 
    def my_slot(self):
        print(self.width())
        print(self.height())
 
    def mousePressEvent(self, event):          # 3
        self.my_signal.emit()
 
if __name__ == '__main__':
    app = QApplication([])
    window = Window()
    window.show()
    sys.exit(app.exec())

運行結果如圖1-28所示。

圖1-28 控制臺輸出結果

代碼解釋:

#1 實例化一個pyqtSignal對象。

#2 將自定義信號與my_slot()槽函數連接。

#3 mousePressEvent()是鼠標按下事件函數,每當鼠標被按下時,該事件函數就會被執行(4.3節會詳細講解窗口事件)。my_siganl信號調用emit()方法將自己發射出去,這樣my_slot()槽函數就會被執行,輸出窗口的寬和高。

2.讓自定義信號攜帶值

如果想要獲取鼠標指針在窗口上的x坐標和y坐標,可以通過信號將坐標值發送過來,詳見示例代碼1-20。

示例代碼1-20

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
 
class Window(QWidget):
    my_signal = pyqtSignal(int, int)       # 1
 
    def __init__(self):
        super(Window, self).__init__()
        self.my_signal.connect(self.my_slot)
 
    def my_slot(self, x, y):               # 2
        print(x)
        print(y)
 
    def mousePressEvent(self, event):      # 3
        x = event.pos().x()
        y = event.pos().y()
        self.my_signal.emit(x, y)
 
if __name__ == '__main__':
    app = QApplication([])
    window = Window()
    window.show()
    sys.exit(app.exec())

運行結果如圖1-29所示。

圖1-29 控制臺輸出結果

代碼解釋:

#1 要通過自定義信號傳值,我們必須在實例化pyqtSignal對象時明確要傳遞的值的類型。由于x坐標和y坐標都是整型值,因此要給pyqtSignal傳入兩個int。

#2 槽函數也要稍做修改,需要增加兩個參數,分別用于接收x坐標和y坐標。

#3 現在我們需要在鼠標按下事件中獲取鼠標指針的xy坐標,并通過emit()方法將其隨信號一同發射出去。

除了整型值,我們還可以讓自定義信號攜帶其他類型(包括Python語言所支持的值類型和PyQt自定義的數據類型)的值,詳見表1-1。

表1-1 自定義信號可攜帶的值類型

對信號和槽機制就暫時講到這里,希望大家能夠花時間理解相關內容,這會讓你在后續的PyQt程序編寫中事半功倍。現在讓我們進入本章的最后一個部分,即學會使用文檔。

主站蜘蛛池模板: 新绛县| 乌苏市| 融水| 武隆县| 休宁县| 靖江市| 云阳县| 原阳县| 龙里县| 松原市| 宜川县| 务川| 天长市| 亚东县| 合江县| 通州区| 漠河县| 和田市| 来宾市| 丹凤县| 岚皋县| 乳山市| 乡宁县| 泰顺县| 锡林浩特市| 金乡县| 定兴县| 金川县| 波密县| 买车| 凤凰县| 揭阳市| 万荣县| 汾西县| 佛教| 房产| 文山县| 嘉义市| 垦利县| 旅游| 平湖市|