[PySide6]QMainWindow - 功能表


Posted by Yen on 2024-01-07

功能表

在一般的視窗中,功能表是指放在最上面的功能列表,如下圖:

這是我從其他軟體偷來的圖片,很清楚的顯示了功能表的長相。

初談訊號與槽

要在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。

這篇文章簡單的談了視窗要怎麼加入功能表,以及訊號與槽的機制,之後我們會討論更多有關於更複雜的功能表,以及更多訊號和槽的應用。


#Python #gui #pyside







Related Posts

Arrays.sort() vs Collections.sort()

Arrays.sort() vs Collections.sort()

How to Set Up Firewall with UFW on Ubuntu 20.04

How to Set Up Firewall with UFW on Ubuntu 20.04

遞迴(Recursion)

遞迴(Recursion)


Comments