- PyQt編程快速上手
- 任路順
- 818字
- 2023-06-21 18:36:04
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 現在我們需要在鼠標按下事件中獲取鼠標指針的x和y坐標,并通過emit()方法將其隨信號一同發射出去。
除了整型值,我們還可以讓自定義信號攜帶其他類型(包括Python語言所支持的值類型和PyQt自定義的數據類型)的值,詳見表1-1。
表1-1 自定義信號可攜帶的值類型

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