雖然標題上跟官方文件的標題都是 Signal & Slot, 但是 Signal & Slot 之間還有一個重要功能叫 emit()
以字面上翻譯的話, Signal(訊號), Slot(訊號槽), emit(發送), 以字面上來看就是今天我們手上有個訊號想要發送給某個訊號槽
以我自己的理解的話, 就像是門, 門鎖和鑰匙, 如果我們要進到某間房間裡的話, 需要先有正確的鑰匙打開目的房間的門鎖, 之後才能打開門進到房間裡。
我們把昨天的 Hello world 稍微修改一下
import sys
from PySide6 import QtCore, QtWidgets
class HelloWorld(QtCore.QObject):
sayHello = QtCore.Signal(str)
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.label = HelloWorld()
self.text = QtWidgets.QLabel("Hello ",
alignment=QtCore.Qt.AlignCenter)
self.label.sayHello.connect(self.magic)
self.label.sayHello.emit("World!")
self.layout = QtWidgets.QVBoxLayout(self)
self.layout.addWidget(self.text)
@QtCore.Slot(str)
def magic(self, sayTo: str):
strOut = "Hello " + sayTo
self.text = QtWidgets.QLabel(strOut,
alignment=QtCore.Qt.AlignCenter)
if __name__ == "__main__":
app = QtWidgets.QApplication([])
widget = MyWidget()
widget.resize(300, 300)
widget.show()
sys.exit(app.exec())
可以看到我們初始的 text 只有 Hello 而已, 但是設定 Signal, connect, emit 跟 Slot 後, 可以得到跟官方最初範例 Hello, world! 一樣的結果。
回到開頭我舉的例子, Signal 就像是鑰匙, Slot 就像是鑰匙孔, 它們後面伴隨的變數就是鑰匙跟鑰匙孔的形狀, 如果其中一個沒有對上就會開門失敗。
但其實多玩玩的話, 把 Day01 最後的程式碼跟上方程式碼裡, @QtCore.Slot() 刪除, 程式可以正常執行且跟刪除前無異。在這兩個例子中 connect 這個功能非常非常重要。
明天就讓我們讓 Slot 發揮他的強大功用吧!