Python 图形开发:PyQt 菜单栏与工具栏的创建

在这篇文章中,我将讲解如何创建菜单栏以及工具栏。

我们将创建一个主窗口,以一个简单的 QLabel 作为中心窗口部件,此外还有菜单栏、工具栏和状态栏。

QLabel 用于在菜单被点击后显示相应的文本,状态栏用于在光标移动到菜单上时显示相应的提示。

我们先给出完整的代码,然后再具体解释这些代码的含义。

完整代码示例

# ------------------------------------------------------------
# Copyright (c) 2017, Wray Zheng. All Rights Reserved.
# Distributed under the BSD License.
# ------------------------------------------------------------

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        # create a central label
        self.label = QLabel("Text to be shown here")
        self.label.setMinimumSize(300, 200)
        self.label.setAlignment(Qt.AlignCenter)
        self.setCentralWidget(self.label)

        # set up status bar
        self.statusBar()

        # create openAction
        openAction = QAction("&Open", self)
        openAction.setShortcut(QKeySequence.Open)
        openAction.setToolTip("Open a file")
        openAction.setStatusTip("Open a file")
        self.connect(openAction, SIGNAL("triggered()"), self.openFile)

        # create other actions by custom method
        quitAction = self.createAction("&Quit", self.quit, "Ctrl+Q",
                "Quit application")
        boldAction = self.createAction("Bold", self.setBold, "Alt+B",
                "Show text in bold style", True, "toggled(bool)")
        resetAction = self.createAction("Reset", self.reset, "Alt+R",
                "Reset text format")

        # create menu
        menuBar = self.menuBar()

        fileMenu = menuBar.addMenu("&File")
        fileMenu.addAction(openAction)
        fileMenu.addAction(quitAction)

        editMenu = menuBar.addMenu("&Edit")
        editUnFormatMenu = editMenu.addMenu("&Format")
        self.addActions(editUnFormatMenu, (boldAction, resetAction))

        # create toolbar
        fileToolbar = self.addToolBar("File")
        fileToolbar.setMovable(False)
        fileToolbar.setObjectName("FileToolBar")
        fileToolbar.addAction(openAction)
        fileToolbar.addAction(quitAction)

        editToolbar = self.addToolBar("Edit")
        editToolbar.setFloatable(False)
        editToolbar.setObjectName("EditToolBar")
        self.addActions(editToolbar, (boldAction, resetAction))

        # set window title
        self.setWindowTitle("Menubar & Toolbar")

    def openFile(self):
        self.label.setText("openAction is triggered")

    def quit(self):
        self.label.setText("quitAction is triggered")

    def setBold(self, isChecked):
        if isChecked:
            self.label.setText("boldAction is checked")
        else:
            self.label.setText("boldAction is not checked")

    def reset(self):
        self.label.setText("resetAction is triggered")

    def createAction(self, text, slot=None, shortcut=None,
            tip=None, checkable=False, signal="triggered()"):
        action = QAction(text, self)
        if shortcut is not None:
            action.setShortcut(shortcut)
        if tip is not None:
            action.setToolTip(tip)
            action.setStatusTip(tip)
        if slot is not None:
            self.connect(action, SIGNAL(signal), slot)
        if checkable:
            action.setCheckable(True)
        return action

    def addActions(self, target, actions):
        for action in actions:
            if action is None:
                target.addSeperator()
            else:
                target.addAction(action)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    app.exec_()

动作(QAction)

创建动作
我们使用 QAction 来创建一个动作,创建 QAction 有以下三种方式:

QAction(QObject)
QAction(QString, QObject)
QAction(QIcon, QString, QObject)

例如:

openAction = QAction("&Open", self)

QObject 表示该动作的父对象,一般将其设为当前窗体,这里即为 self。

设置快捷键
然后使用 QAction 的 setShortcut() 方法来设置快捷键,可以使用 PyQt 内置的常量来设置,例如 QKeySequence.Open,也可以使用字符串来设置,例如 "Ctrl+O"。

openAction.setShortcut(QKeySequence.Open)

设置提示
接着,设置状态栏和工具栏提示信息:

openAction.setToolTip("Open a file")
openAction.setStatusTip("Open a file")

该提示信息会在鼠标移到菜单选项上方时显示在状态栏中,以及移到工具栏上方时以气泡方式显示出来。

连接信号
最后,将动作(action),也就是菜单的选项,连接到对应的槽中:

self.connect(openAction, SIGNAL("triggered()"), self.openFile)

当我们点击菜单选项时,便会触发该动作的 triggered() 信号,从而调用相应的方法。

统一创建动作
当我们需要创建多个动作时,可以编写一个专门用来创建动作的方法,统一连接信号、设置快捷键、提示信息等等。

class MainWindow(QMainWindow):
    ...
    def createAction(self, text, slot=None, shortcut=None,
            tip=None, checkable=False, signal="triggered()"):
        action = QAction(text, self)
        if shortcut is not None:
            action.setShortcut(shortcut)
        if tip is not None:
            action.setToolTip(tip)
            action.setStatusTip(tip)
        if slot is not None:
            self.connect(action, SIGNAL(signal), slot)
        if checkable:
            action.setCheckable(True)
        return action

这样我们就可以通过这个方法来创建动作并完成一系列的设置了:

quitAction = self.createAction("&Quit", self.quit, "Ctrl+Q",
        "Quit application")

菜单栏(QMenuBar)

添加菜单
创建完 QAction 之后,我们需要创建菜单来放置这些动作。通过 QMainWindow 的 menuBar() 方法可以获取到菜单栏实例(QMenuBar),调用该实例的 addMenu() 方法则可以添加菜单(QMenu)。

menuBar = self.menuBar()
fileMenu = menuBar.addMenu("&File")

添加动作
添加完菜单之后,其本身是空的,我们需要将先前创建的动作添加到菜单上。

fileMenu.addAction(openAction)
fileMenu.addAction(quitAction)

添加一组动作
当我们需要添加多个动作时,可以编写一个 addActions() 方法来批量添加一组动作。接下来,我们就来看看如何实现 addActions() 方法。

class MainWindow(QMainWindow):
    ...
    def addActions(self, target, actions):
        for action in actions:
            if action is None:
                target.addSeperator()
            else:
                target.addAction(action)

添加子菜单
我们通过 QMenu.addMenu() 方法在 Edit 菜单中添加子菜单 Format,并调用自定义的 addActions() 方法来添加一组动作:

editMenu = menuBar.addMenu("&Edit")
editUnFormatMenu = editMenu.addMenu("&Format")
self.addActions(editUnFormatMenu, (boldAction, resetAction))

工具栏(QToolBar)

添加工具栏

fileToolbar = self.addToolBar("File")

禁止移动/浮动

fileToolbar.setMovable(False)
editToolbar.setFloatable(False)

设置对象名
通过设置工具栏对象的名称,我们可以在后续代码中更方便地引用该工具栏。实际上,每一个 QObject 都有一个 setObjectName() 方法,设定对象名相当于给对象设定一个独一无二的标识。

fileToolbar.setObjectName("FileToolBar")

添加动作

fileToolbar.addAction(openAction)
fileToolbar.addAction(quitAction)

添加一组动作
由于 QMenu 与 QToolBar 都提供了 addAction()addSeparator() 方法,因此我们也可以将上面自定义的 addActions() 方法用于工具栏的动作添加:

self.addActions(editToolbar, (boldAction, resetAction))

至此,我们就完成了菜单栏和工具栏的创建。

相关信号

QAction

changed()
hovered()
toggled(bool)
triggered(bool=0)

QMenu

aboutToHide()
aboutToShow()
hovered(QAction*)
triggered(QAction*)

QMenuBar

hovered(QAction*)
triggered(QAction*)

相关文章

Loading Likes...

发表评论

电子邮件地址不会被公开。 必填项已用*标注