功能表
在一般的視窗中,功能表是指放在最上面的功能列表,如下圖:
這是我從其他軟體偷來的圖片,很清楚的顯示了功能表的長相。
初談訊號與槽
要在QMainWindow中添加功能表,首先要先創造一個QAction物件,這個物件掌管了訊號(signal)與槽(slot)之間的串接。訊號與槽是Qty在主迴圈中控制行為與反應的方式,比起其他框架用的callback方法,訊號與槽很簡潔並明瞭的串接了一個物件所發出來的訊號(行為)和槽(反應)。在談QAction之前,我們可以先看一個簡單的按按鈕程式碼。
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton, QLabel
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
button = QPushButton("按我", self)
button.clicked.connect(self.button_clicked)
def button_clicked(self):
self.dialog = QDialog(self)
self.dialog.setWindowTitle("對話視窗")
label = QLabel("你按了按鈕", self.dialog)
self.dialog.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
main_win = MainWindow()
main_win.show()
sys.exit(app.exec())
從button.clicked.connect()
這個方法來看,顧名思義,就是將按鈕備案下的這個訊號連接到參數提供的槽,而這次使用的槽的名稱叫做button_clicked()
,它會建立一個QDialog的對話視窗,並顯示「你按了按鈕」字樣。在PySide6中,QPushButton
是繼承自QAbstractButton
類別,而QAbstractButton
類別定義了內建的訊號clicked
,所以我們才可以在這裡使用button.clicked
這個訊號。順帶一提,訊號和槽可以是一對一,多對一或是一對多的關係,是十分靈活的一個機制。
QAction
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QDialog, QLabel
from PySide6.QtGui import QAction
class MenuWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setup_main_ui()
def setup_main_ui(self):
self.setWindowTitle("Yen.Studio")
self.resize(800, 600)
menu = self.menuBar()
menu_action = self.setup_action()
action_menu = menu.addMenu("&Action")
action_menu.addAction(menu_action)
def setup_action(self):
action = QAction("Click Me", self)
action.triggered.connect(self.on_item_clicked)
return action
def on_item_clicked(self):
self.dialog = QDialog(self)
self.dialog.setWindowTitle("對話視窗")
label = QLabel("你按了按鈕", self.dialog)
self.dialog.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
menu_win = MenuWindow()
menu_win.show()
sys.exit(app.exec())
從這段程式碼可以看到,在setup_action
方法中,我們定義了一個QAction
,並且將它的triggered
信號連結到槽方法,然後在action_menu
中加入這個QAction
。如此一來,我們的視窗就有了一個功能表,而在action_menu = menu.addMenu(”&Action”)
這裡,在名稱字串的前面加上&符號,代表設定成快捷鍵,在這裡就是Alt+A。
這篇文章簡單的談了視窗要怎麼加入功能表,以及訊號與槽的機制,之後我們會討論更多有關於更複雜的功能表,以及更多訊號和槽的應用。