天天看點

PyQt6中的菜單欄和工具欄PyQt6中的菜單欄和工具欄

PyQt6安裝

  1. 使用pip工具安裝PyQt6工具。
    pip install PyQt6      
  2. 安裝Qt Designer圖形界面開發工具。
    pip install PyQt6-tools      

PyQt6中的菜單欄和工具欄

在PyQt6教程的這一部分中,我們将建立狀态欄、菜單欄和工具欄。菜單是位于菜單欄中的一組指令。工具欄具有應用程式中一些常用指令的按鈕。狀态欄顯示狀态資訊,通常位于應用程式視窗的底部。

PyQt6 QMainWindow

QMainWindow類提供了一個主應用程式視窗。這樣就可以建立一個帶有狀态欄、工具欄和菜單欄的經典應用程式架構。

PyQt6狀态欄

狀态欄是用于顯示狀态資訊的控件。

import sys
from PyQt6.QtWidgets import QMainWindow, QApplication


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.statusBar().showMessage('Ready')

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Statusbar')
        self.show()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
           

狀态欄是在QMainWindow控件的幫助下建立的。

self.statusBar().showMessage('Ready')
           

為了獲得狀态欄,我們調用QtGui.QMainWindow類的statusBar方法。該方法的第一次調用将建立一個狀态欄。随後的調用傳回狀态欄對象。showMessage在狀态欄上顯示一條消息。

PyQt6簡單的菜單

菜單欄是GUI應用程式的常見部分。它是位于各種菜單中的一組指令。(Mac OS對菜單的處理方式不同。要獲得類似的結果,我們可以添加以下行:menubar.setNativeMenuBar(False)。

import sys
from PyQt6.QtWidgets import QMainWindow, QApplication
from PyQt6.QtGui import QIcon, QAction


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        exitAct = QAction(QIcon('img/exit.png'), '&Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(QApplication.instance().quit)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Simple menu')
        self.show()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
           

在上面的例子中,我們建立了一個隻有一個菜單的菜單欄。此菜單包含一個操作,如果選中,該操作将終止應用程式。狀态欄也會被建立。該操作可以通過Ctrl+Q快捷鍵通路。

exitAct = QAction(QIcon('img/exit.png'), '&Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit application')
           

QAction是對使用菜單欄、工具欄或自定義鍵盤快捷鍵執行的操作的抽象。在上面的三行代碼中,我們建立了一個帶有特定圖示和'Exit'标簽的操作。此外,還為該操作定義了一個快捷方式。第三行建立一個狀态提示,當我們将滑鼠指針懸停在菜單項上時,它将顯示在狀态欄中。

exitAct.triggered.connect(QApplication.instance().quit)
           

當我們選擇這個特定的動作時,一個被觸發的信号被發射。信号連接配接到QApplication控件的退出方法。這将終止應用程式。

menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAct)
           

menuBar方法建立一個菜單欄。我們用addMenu建立一個檔案菜單,并用addAction添加動作。

PyQt6子菜單

子菜單是位于另一個菜單中的菜單。

import sys
from PyQt6.QtWidgets import QMainWindow, QMenu, QApplication
from PyQt6.QtGui import QAction


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')

        impMenu = QMenu('Import', self)
        impAct = QAction('Import mail', self)
        impMenu.addAction(impAct)

        newAct = QAction('New', self)

        fileMenu.addAction(newAct)
        fileMenu.addMenu(impMenu)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Submenu')
        self.show()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
           

在這個例子中,我們有兩個菜單項;一個位于檔案菜單,另一個位于檔案的導入子菜單。

impMenu = QMenu('Import', self)
           

使用QMenu建立新菜單。

impAct = QAction('Import mail', self)
impMenu.addAction(impAct)
           

通過addAction向子菜單添加一個操作。

PyQt6可選菜單

在下面的示例中,我們建立了一個可以勾選和取消勾選的菜單。

import sys
from PyQt6.QtWidgets import QMainWindow, QApplication
from PyQt6.QtGui import QAction


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.statusbar = self.statusBar()
        self.statusbar.showMessage('Ready')

        menubar = self.menuBar()
        viewMenu = menubar.addMenu('View')

        viewStatAct = QAction('View statusbar', self, checkable=True)
        viewStatAct.setStatusTip('View statusbar')
        viewStatAct.setChecked(True)
        viewStatAct.triggered.connect(self.toggleMenu)

        viewMenu.addAction(viewStatAct)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Check menu')
        self.show()


    def toggleMenu(self, state):

        if state:
            self.statusbar.show()
        else:
            self.statusbar.hide()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
           

代碼示例建立了一個可操作的View菜單。該操作顯示或隐藏狀态欄。當狀态欄可見時,菜單項被選中。

viewStatAct = QAction('View statusbar', self, checkable=True)
           

使用可勾選選項,我們建立了一個可選菜單。

viewStatAct.setChecked(True)
           

因為狀态欄從一開始就是可見的,是以我們用setChecked方法來勾選這個動作。

def toggleMenu(self, state):

    if state:
        self.statusbar.show()
    else:
        self.statusbar.hide()
           

根據操作的狀态,顯示或隐藏狀态欄。

PyQt6上下文菜單

上下文菜單,也稱為彈出菜單,是出現在某個上下文下的指令清單。例如,在Opera網絡浏覽器中,當我們右擊網頁時,我們會得到一個上下文菜單。在這裡,我們可以重新加載頁面、傳回或檢視頁面源。如果我們右鍵單擊工具欄,我們會得到另一個管理工具欄的上下文菜單。

import sys
from PyQt6.QtWidgets import QMainWindow, QMenu, QApplication


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Context menu')
        self.show()


    def contextMenuEvent(self, event):

        cmenu = QMenu(self)

        newAct = cmenu.addAction("New")
        openAct = cmenu.addAction("Open")
        quitAct = cmenu.addAction("Quit")
        action = cmenu.exec(self.mapToGlobal(event.pos()))

        if action == quitAct:
            QApplication.instance().quit()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
           

要使用上下文菜單,我們必須重新實作contextMenuEvent方法。

action = cmenu.exec(self.mapToGlobal(event.pos()))      

使用exec方法顯示上下文菜單。從事件對象擷取滑鼠指針的坐标。mapToGlobal方法将控件坐标轉換為全局螢幕坐标。

if action == quitAct:
    QApplication.instance().quit()      

如果從上下文菜單傳回的操作等于quit操作,則終止應用程式。

PyQt6工具欄

菜單将我們可以在應用程式中使用的所有指令分組。工具欄提供了對最常用指令的快速通路。

import sys
from PyQt6.QtWidgets import QMainWindow,  QApplication
from PyQt6.QtGui import QIcon, QAction


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        exitAct = QAction(QIcon('img/exit.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(QApplication.instance().quit)

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAct)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Toolbar')
        self.show()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
           

在上面的示例中,我們建立了一個簡單的工具欄。工具欄有一個工具操作,即當被觸發時終止應用程式的退出操作。

exitAct = QAction(QIcon('img/exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(QApplication.instance().quit)      

類似于上面的菜單欄示例,我們建立了一個動作對象。該對象具有标簽、圖示和快捷方式。QApplication的退出方法連接配接到觸發信号。

self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)      

工具欄是使用addToolBar方法建立的。我們通過addAction向工具欄添加一個動作對象。

PyQt6主視窗

在本節的最後一個示例中,我們将建立一個菜單欄、工具欄和狀态欄。我們還建立了一個中心控件。

import sys
from PyQt6.QtWidgets import QMainWindow, QTextEdit, QApplication
from PyQt6.QtGui import QIcon, QAction


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        textEdit = QTextEdit()
        self.setCentralWidget(textEdit)

        exitAct = QAction(QIcon('img/exit.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(self.close)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAct)

        toolbar = self.addToolBar('Exit')
        toolbar.addAction(exitAct)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('Main window')
        self.show()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()
           

這個代碼示例建立了一個帶有菜單欄、工具欄和狀态欄的經典GUI應用程式的架構。

textEdit = QTextEdit()
self.setCentralWidget(textEdit)      

這裡我們建立了一個文本編輯控件。我們将它設定為QMainWindow的中心控件。中央控件會占用所有剩餘的空間。

在PyQt6教程的這一部分中,我們使用了菜單、工具欄、狀态欄和主應用程式視窗。