1 PyQt菜单与工具栏简介
在PyQt应用程序开发中,菜单栏、工具栏和状态栏是创建专业级桌面应用程序的关键组件。它们提供:
- 应用程序功能的直观访问点
- 常用操作的快捷方式
- 用户操作的状态反馈
- 符合操作系统标准的用户体验
菜单栏 (QMenuBar)
通常位于窗口顶部,包含下拉菜单(文件、编辑、视图等),使用QMenu和QAction类创建。
工具栏 (QToolBar)
可停靠的面板,包含常用操作的图标按钮,提供快速访问功能。
状态栏 (QStatusBar)
位于窗口底部,显示应用程序状态信息、提示消息等。
3 创建PyQt工具栏
工具栏提供对常用功能的快速访问,提高用户效率。
工具栏创建示例
def initUI(self):
# 创建工具栏
toolbar = self.addToolBar('主工具栏')
# 添加带图标的操作
newAction = QAction(QIcon('new.png'), '新建', self)
newAction.setShortcut('Ctrl+N')
toolbar.addAction(newAction)
# 添加分隔线
toolbar.addSeparator()
# 添加其他操作
saveAction = QAction(QIcon('save.png'), '保存', self)
saveAction.setShortcut('Ctrl+S')
toolbar.addAction(saveAction)
# 添加下拉按钮
exportMenu = QMenu(self)
exportMenu.addAction('导出为PDF')
exportMenu.addAction('导出为PNG')
exportBtn = QToolButton()
exportBtn.setMenu(exportMenu)
exportBtn.setPopupMode(QToolButton.InstantPopup)
exportBtn.setIcon(QIcon('export.png'))
exportBtn.setText('导出')
toolbar.addWidget(exportBtn)
# 连接信号
newAction.triggered.connect(self.newFile)
saveAction.triggered.connect(self.saveFile)
工具栏设计技巧
- 使用标准工具栏图标保持一致性
- 为工具栏按钮添加提示文本(tooltip)
- 允许用户自定义工具栏位置
- 分组相关工具(文件操作、格式操作等)
- 提供工具栏显示/隐藏选项
高级工具栏功能
- 可停靠工具栏(允许拖动)
- 工具栏上下文菜单
- 工具按钮样式设置(仅图标、文本在旁等)
- 添加自定义控件(组合框、搜索框等)
- 工具栏状态保存与恢复
4 创建状态栏
状态栏提供应用程序状态信息和用户提示。
状态栏使用示例
def initUI(self):
# 创建状态栏
statusbar = self.statusBar()
# 添加永久性部件(右侧)
self.permanentLabel = QLabel('就绪')
statusbar.addPermanentWidget(self.permanentLabel)
# 显示临时消息(5秒)
statusbar.showMessage('应用程序已启动', 5000)
# 添加进度条
self.progressBar = QProgressBar()
self.progressBar.setMaximumWidth(200)
self.progressBar.setVisible(False)
statusbar.addPermanentWidget(self.progressBar)
# 示例:处理菜单悬停
self.menuBar().hovered.connect(self.updateStatusBar)
def updateStatusBar(self, action):
if action:
self.statusBar().showMessage(action.toolTip(), 3000)
def startProgress(self):
self.progressBar.setVisible(True)
self.progressBar.setRange(0, 0) # 不确定模式
状态栏最佳实践
- 左侧用于临时消息(操作提示、状态信息)
- 右侧用于永久性状态指示(光标位置、模式等)
- 使用超时消息自动清除临时通知
- 为长时间操作添加进度指示器
- 保持状态信息简洁明了
5 完整PyQt菜单与工具栏示例
下面是一个整合了菜单栏、工具栏和状态栏的完整PyQt示例:
完整应用程序代码
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QAction, QMenu,
QToolBar, QStatusBar, QLabel, QToolButton,
QMessageBox, QProgressBar)
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
class MainApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt菜单与工具栏示例")
self.setGeometry(100, 100, 800, 600)
self.initUI()
def initUI(self):
# 创建菜单栏
self.createMenuBar()
# 创建工具栏
self.createToolBar()
# 创建状态栏
self.createStatusBar()
def createMenuBar(self):
menubar = self.menuBar()
# 文件菜单
fileMenu = menubar.addMenu("文件(&F)")
newAction = QAction(QIcon.fromTheme("document-new"), "新建(&N)", self)
newAction.setShortcut("Ctrl+N")
newAction.setStatusTip("创建新文件")
newAction.triggered.connect(self.newFile)
fileMenu.addAction(newAction)
openAction = QAction(QIcon.fromTheme("document-open"), "打开(&O)...", self)
openAction.setShortcut("Ctrl+O")
openAction.triggered.connect(self.openFile)
fileMenu.addAction(openAction)
fileMenu.addSeparator()
saveAction = QAction(QIcon.fromTheme("document-save"), "保存(&S)", self)
saveAction.setShortcut("Ctrl+S")
saveAction.triggered.connect(self.saveFile)
fileMenu.addAction(saveAction)
# 编辑菜单
editMenu = menubar.addMenu("编辑(&E)")
cutAction = QAction(QIcon.fromTheme("edit-cut"), "剪切(&T)", self)
cutAction.setShortcut("Ctrl+X")
editMenu.addAction(cutAction)
copyAction = QAction(QIcon.fromTheme("edit-copy"), "复制(&C)", self)
copyAction.setShortcut("Ctrl+C")
editMenu.addAction(copyAction)
pasteAction = QAction(QIcon.fromTheme("edit-paste"), "粘贴(&P)", self)
pasteAction.setShortcut("Ctrl+V")
editMenu.addAction(pasteAction)
# 帮助菜单
helpMenu = menubar.addMenu("帮助(&H)")
aboutAction = QAction("关于(&A)", self)
aboutAction.triggered.connect(self.showAbout)
helpMenu.addAction(aboutAction)
def createToolBar(self):
# 主工具栏
mainToolbar = self.addToolBar("主工具栏")
mainToolbar.setMovable(True)
newAction = QAction(QIcon.fromTheme("document-new"), "新建", self)
newAction.triggered.connect(self.newFile)
mainToolbar.addAction(newAction)
openAction = QAction(QIcon.fromTheme("document-open"), "打开", self)
openAction.triggered.connect(self.openFile)
mainToolbar.addAction(openAction)
saveAction = QAction(QIcon.fromTheme("document-save"), "保存", self)
saveAction.triggered.connect(self.saveFile)
mainToolbar.addAction(saveAction)
mainToolbar.addSeparator()
# 格式工具栏
formatToolbar = self.addToolBar("格式工具栏")
boldAction = QAction(QIcon.fromTheme("format-text-bold"), "粗体", self)
boldAction.setCheckable(True)
formatToolbar.addAction(boldAction)
italicAction = QAction(QIcon.fromTheme("format-text-italic"), "斜体", self)
italicAction.setCheckable(True)
formatToolbar.addAction(italicAction)
def createStatusBar(self):
statusbar = self.statusBar()
# 左侧状态标签
self.statusLabel = QLabel("就绪")
statusbar.addWidget(self.statusLabel)
# 右侧永久部件
self.cursorPosLabel = QLabel("行: 1, 列: 1")
statusbar.addPermanentWidget(self.cursorPosLabel)
# 进度条
self.progressBar = QProgressBar()
self.progressBar.setMaximumWidth(200)
self.progressBar.setVisible(False)
statusbar.addPermanentWidget(self.progressBar)
def newFile(self):
self.statusLabel.setText("创建新文件")
def openFile(self):
self.statusLabel.setText("打开文件...")
def saveFile(self):
self.statusLabel.setText("保存文件")
# 模拟保存过程
self.progressBar.setVisible(True)
self.progressBar.setRange(0, 100)
for i in range(101):
self.progressBar.setValue(i)
QApplication.processEvents()
self.progressBar.setVisible(False)
self.statusLabel.setText("文件保存成功")
def showAbout(self):
QMessageBox.information(self, "关于", "PyQt菜单与工具栏示例 v1.0")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainApp()
window.show()
sys.exit(app.exec_())
运行效果说明
此示例创建了一个完整的PyQt应用程序窗口,包含:
- 顶部菜单栏(文件、编辑、帮助)
- 两个可移动工具栏(主工具栏、格式工具栏)
- 底部状态栏(状态消息、光标位置、进度条)
- 菜单项和工具栏按钮的功能实现
- 文件保存过程的进度指示
这个示例展示了如何将菜单、工具栏和状态栏组合使用,创建专业的GUI应用程序界面。
发表评论