在这篇文章中,我将讲解如何创建菜单栏以及工具栏。
我们将创建一个主窗口,以一个简单的 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*)
作者:Wray Zheng
原文:http://www.codebelief.com/article/2017/04/python-gui-development-creation-of-pyqt-menubar-and-toolbar/