PyQt QAction类及其应用
PyQt QAction类及其应用
- 一、PyQt QAction类及其应用
- 1、主要功能与特性
- 2、 创建 QAction 对象
- 3、 QAction 的应用示例
- 4、代码说明
- 5、总结
- 二、代码示例
- 1、源码分享
- 2、效果展示:
一、PyQt QAction类及其应用
QAction是 PyQt6 中一个非常重要的类,它代表用户界面中的一个“动作”或“操作”。它是对用户可执行命令(如点击菜单项、工具栏按钮、或按快捷键)的抽象封装。QAction的核心思想是“一次定义,多处使用”。你可以创建一个QAction对象,然后将其添加到多个地方(例如菜单栏、工具栏、右键菜单),当用户通过任何方式触发这个动作时,都会执行相同的操作(连接到同一个槽函数)。
1、主要功能与特性
封装操作信息:
- 文本 (
text):动作显示的名称(如菜单项文字)。 - 图标 (
icon):动作的可视化表示(如工具栏按钮图标)。 - 快捷键 (
shortcut):触发动作的键盘组合(如Ctrl+C)。 - 状态提示 (
statusTip):鼠标悬停时在状态栏显示的提示信息。 - 工具提示 (
toolTip):鼠标悬停时显示的提示气泡。 - 是否可用 (
enabled):控制动作是否处于激活状态(可点击)。 - 是否可见 (
visible):控制动作是否在界面上显示。 - 是否可勾选 (
checkable):动作是否具有开/关两种状态(类似复选框)。 - 当前状态 (
checked):如果动作是可勾选的,表示其当前是选中还是未选中状态。
- 文本 (
触发信号:
triggered():这是最常用的信号。当用户通过任何方式(菜单、工具栏、快捷键)激活动作时,就会发出此信号。通常连接到执行具体操作的槽函数。toggled(bool):如果动作是可勾选的 (checkable=True),当它的选中状态发生改变时,会发出此信号,并传递新的状态值 (True或False)。
添加到界面组件:
QMenu:使用addAction(QAction)或addAction(text, callable)将动作添加到菜单中。QToolBar:使用addAction(QAction)将动作添加到工具栏中。- 其他组件:理论上,任何支持动作的组件都可以添加。
2、 创建 QAction 对象
有两种常见方式:
直接创建:
fromPyQt6.QtGuiimportQAction,QIcon# 创建一个带有图标、文本和快捷键的动作open_action=QAction(QIcon("open.png"),"&Open",self)# '&' 定义快捷键 Alt+Oopen_action.setShortcut("Ctrl+O")open_action.setStatusTip("Open an existing file")open_action.triggered.connect(self.open_file)# 连接到槽函数通过菜单或工具栏创建 (并自动获取动作):
# 在菜单上添加一个动作项,并返回该 QAction 对象save_action=file_menu.addAction("&Save",self.save_file)# 同时指定文本和槽函数save_action.setShortcut("Ctrl+S")
3、 QAction 的应用示例
下面是一个简单的 PyQt6 应用程序示例,演示了QAction在菜单栏和工具栏中的使用,以及快捷键、状态提示等功能:
importsysfromPyQt6.QtWidgetsimport(QApplication,QMainWindow,QTextEdit,QMenuBar,QMenu,QToolBar,QStatusBar)fromPyQt6.QtGuiimportQAction,QIconfromPyQt6.QtCoreimportQtclassMainWindow(QMainWindow):def__init__(self):super().__init__()# 创建中心部件 - 一个文本编辑器self.text_edit=QTextEdit()self.setCentralWidget(self.text_edit)# 创建状态栏self.statusBar().showMessage("Ready")# 创建菜单栏menubar=self.menuBar()# 文件菜单file_menu=menubar.addMenu("&File")# 创建 '打开' 动作open_action=QAction(QIcon("open.png"),"&Open",self)open_action.setShortcut("Ctrl+O")open_action.setStatusTip("Open an existing file")open_action.triggered.connect(self.open_file)file_menu.addAction(open_action)# 添加到文件菜单# 创建 '保存' 动作 (通过菜单的 addAction 方法)save_action=file_menu.addAction("&Save",self.save_file)# 同时指定文本和槽函数save_action.setShortcut("Ctrl+S")save_action.setStatusTip("Save the current file")# 添加分隔线file_menu.addSeparator()# 创建 '退出' 动作exit_action=file_menu.addAction("E&xit",self.close)exit_action.setShortcut("Ctrl+Q")exit_action.setStatusTip("Exit the application")# 编辑菜单edit_menu=menubar.addMenu("&Edit")# 创建 '复制' 动作 (初始禁用,因为可能没有选中文本)self.copy_action=QAction("&Copy",self)self.copy_action.setShortcut("Ctrl+C")self.copy_action.setStatusTip("Copy selected text")self.copy_action.triggered.connect(self.text_edit.copy)self.copy_action.setEnabled(False)# 初始不可用edit_menu.addAction(self.copy_action)# 创建 '粘贴' 动作paste_action=QAction("&Paste",self)paste_action.setShortcut("Ctrl+V")paste_action.setStatusTip("Paste clipboard content")paste_action.triggered.connect(self.text_edit.paste)edit_menu.addAction(paste_action)# 工具栏toolbar=QToolBar("Main Toolbar")self.addToolBar(toolbar)# 将 '打开' 和 '保存' 动作添加到工具栏 (复用之前创建的 open_action 和 save_action)toolbar.addAction(open_action)toolbar.addAction(save_action)# 添加一个分隔线toolbar.addSeparator()# 在工具栏添加 '退出' 动作toolbar.addAction(exit_action)# 连接文本编辑器的选择改变信号,以更新 '复制' 动作状态self.text_edit.selectionChanged.connect(self.update_copy_action)defopen_file(self):# 这里应该是打开文件对话框并加载文件的逻辑self.statusBar().showMessage("Open file action triggered")defsave_file(self):# 这里应该是保存文件对话框并保存文件的逻辑self.statusBar().showMessage("Save file action triggered")defupdate_copy_action(self):# 根据是否有选中文本来启用/禁用复制动作self.copy_action.setEnabled(self.text_edit.textCursor().hasSelection())if__name__=="__main__":app=QApplication(sys.argv)window=MainWindow()window.show()sys.exit(app.exec())4、代码说明
创建动作 (
QAction):- 创建了
open_action,save_action,exit_action,copy_action,paste_action等动作对象。 - 设置了它们的文本 (
text)、图标 (icon- 仅open_action)、快捷键 (shortcut)、状态提示 (statusTip)。 - 使用
triggered.connect()将动作连接到执行实际功能的槽函数 (self.open_file,self.save_file,self.text_edit.copy,self.text_edit.paste,self.close)。
- 创建了
添加到菜单 (
QMenu):- 创建了
File和Edit菜单。 - 使用
addAction(QAction)将动作添加到菜单中。 - 使用了
addSeparator()添加菜单分隔线。 - 对于
save_action和exit_action,直接使用了menu.addAction(text, callable)的方式创建并添加动作。
- 创建了
添加到工具栏 (
QToolBar):- 创建了一个工具栏。
- 使用
addAction(QAction)将之前创建的open_action,save_action,exit_action添加到工具栏中。这体现了QAction的复用性。 - 使用了
addSeparator()添加工具栏分隔线。
状态栏 (
QStatusBar):- 设置了状态栏,并在动作触发时显示状态提示信息。
动态更新动作状态:
copy_action初始设置为禁用 (setEnabled(False))。- 将文本编辑器 (
QTextEdit) 的selectionChanged信号连接到update_copy_action槽函数。 - 在
update_copy_action中,根据文本编辑器中是否有选中的文本 (textCursor().hasSelection()) 来动态启用或禁用copy_action。这使得“复制”功能只有在有文本选中时才可用。
5、总结
QAction是构建 PyQt6 应用程序用户交互的核心组件。它提供了一种集中定义操作(包括其外观、行为和触发方式)并将其灵活应用于界面不同位置(菜单、工具栏等)的高效方式。通过信号与槽机制,QAction将用户界面上的操作与实际的功能代码紧密连接起来。熟练掌握QAction的使用,对于创建结构清晰、功能完善的 PyQt6 GUI 应用程序至关重要。
二、代码示例
1、源码分享
importsysfromPyQt6.QtWidgetsimportQApplication,QMainWindow,QMessageBox,QToolBarfromPyQt6.QtGuiimportQAction,QKeySequencefromPyQt6.QtCoreimportQtclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("PyQt6 QAction 示例")resizeWidth=600resizeHeight=400self.resize(resizeWidth,resizeHeight)# ========== 创建 QAction ==========self.act_open=QAction("打开文件",self)self.act_open.setShortcut("Ctrl+O")# 修复写法self.act_save=QAction("保存",self)self.act_save.setShortcut("Ctrl+S")# 修复写法self.act_about=QAction("关于",self)self.act_about.setShortcut("Ctrl+H")# 修复写法# ========== 绑定信号 ==========self.act_open.triggered.connect(self.on_open)self.act_save.triggered.connect(self.on_save)self.act_about.triggered.connect(self.on_about)# ========== 菜单栏 ==========file_menu=self.menuBar().addMenu("文件")file_menu.addAction(self.act_open)file_menu.addAction(self.act_save)file_menu.addSeparator()file_menu.addAction(self.act_about)# ========== 工具栏 ==========toolbar=QToolBar()self.addToolBar(toolbar)toolbar.addAction(self.act_open)toolbar.addAction(self.act_save)toolbar.addAction(self.act_about)# 状态栏self.statusBar().showMessage("就绪")# ========== 槽函数 ==========defon_open(self):self.statusBar().showMessage("打开文件操作",2000)defon_save(self):QMessageBox.information(self,"提示","保存成功!")defon_about(self):QMessageBox.about(self,"关于","PyQt6 QAction 演示")if__name__=="__main__":app=QApplication(sys.argv)window=MainWindow()window.show()sys.exit(app.exec())