QAction类提供了抽象的用户界面action,这些action可以放置到窗口部件中。

应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命令。由于用户期望每个命令都能以相同的方式执行,而不管命令所使用的用户界面。

这个时候action来表示这些命令就显得十分有用,

Actions可以被添加到菜单和工具栏中,并且可以自动保持在菜单和工具栏中的同步。例如,在一个字处理软件中,如果用户在工具栏中按下了Bold按钮,那么菜单中的Bold选项就会自动被选中。

Actions可以作为独立的对象被创建,但是我们也可以在构建菜单的时候创建它们;QMenu类包含了非常简便的方法用于创建适合用作菜单项的actions。

可以通过QWidget::addAction()或者是QGraphicsWidget::addAction()函数将Actions添加到窗口部件上。注意,只有将Actions添加到窗口部件上之后,我们才可以使用这些actions;当actions的快捷键是全局的时候,我们也必须先将actions添加到窗口部件上。

一旦QAction被创建了,那么就必须将它添加到相关的菜单和工具栏上,然后将它们链接到实现相应action功能的槽函数上。例如:

  1. QToolBar* toolBar = addToolBar("File Action");
  2. QMenu* menu = menuBar()->addMenu("File");
  3. QAction* actionSave = menu->addAction(tr("&Save"));
  4. // 设置快捷键
  5. actionSave->setShortcut(QKeySequence::Save);
  6. actionSave->setStatusTip("Save Content");
  7. toolBar->addAction(actionSave);
  8. connect(actionSave, &QAction::triggered, this, []() {
  9. qDebug() << "triggered";
  10. });

我们建议将actions作为使用它们的窗口的孩子创建。在绝大多数情况下,actions都是应用程序主窗口的孩子。

类的枚举成员变量:
enum QAction::ActionEvent
This enum type is used when calling QAction::activate()

constant value Description
QAction::Trigger 0 this will cause the QAction::triggered() signal to be emitted.
QAction::Hover 1 this will cause the QAction::hovered() signal to be emitted.

这个枚举类型主要是在调用QAction::activate()函数的时候被使用到。我们来看看QAction::activate()函数的原型:

  1. void QAction::activate(QAction::ActionEvent event)
  2. Sends the relevant signals for ActionEvent event.
  3. Action based widgets use this API to cause the QAction to emit signals
  4. as well as emitting their own.

从上面可以看出,我们使用该函数发射信号,而参数event则指明了发射的信号类型。基于action的widgets可以自己发射信号,然而我们也可以显式的调用本API来发射信号。

enum QAction::MenuRole

Constant Value Description
QAction::NoRole 0 This action should not be put into the application menu
QAction::TextHeuristicRole 1 This action should be put in the application menu based on the action’s text as described in the QMenuBar documentation.
QAction::ApplicationSpecificRole 2 This action should be put in the application menu with an application specific role
QAction::AboutQtRole 3 This action handles the “About Qt” menu item.
QAction::AboutRole 4 This action should be placed where the “About” menu item is in the application menu. The text of the menu item will be set to “About “. The application name is fetched from the Info.plist file in the application’s bundle (See Qt for macOS - Deployment).
QAction::PreferencesRole 5 This action should be placed where the “Preferences…” menu item is in the application menu.
QAction::QuitRole 6 This action should be placed where the Quit menu item is in the application menu.

由于Mac OS X系统的一些特性,Qt 会对一些菜单项进行自动排列。比如,如果你的菜单是“关于”、“设置”、“首选项”、“退出”等等,我们可以给它们分配一个角色,Qt 则会根据这些角色对菜单项的顺序作出正确的排列。方法是,设置 QAction::menuRole 属性,例如:AboutRole、PreferencesRole、QuitRole 或者 NoRole。举例来说,我们可以将“设置”菜单项作为 Mac OS X 的 Application::preferences。

QAction::MenuRole类型的枚举主要描述了在Mac OS X系统上,action如何移动到应用程序的菜单上。设置这个值只对菜单上的直接菜单有效,对子菜单无效。例如:如果有一个File菜单,该File菜单又包含有子菜单,那么如果你针对子菜单设置这些值,那么这些值永远不会起作用。

enum QAction::Priority

Constant Value Description
QAction::LowPriority 0 The action should not be prioritized in the user interface.
QAction::NormalPriority 128
QAction::HighPriority 256 The action should be prioritized in the user interface.

该优先级用于表明action在用户界面上的优先级。例如,当你的工具栏设置了Qt::ToolButtonTextBesideIcon模式,那么低优先级的actions将不会显示出标签。

示例

头文件

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QAction>
  4. #include <QDebug>
  5. #include <QMainWindow>
  6. #include <QMenu>
  7. #include <QToolBar>
  8. QT_BEGIN_NAMESPACE
  9. namespace Ui {
  10. class MainWindow;
  11. }
  12. QT_END_NAMESPACE
  13. class MainWindow : public QMainWindow {
  14. Q_OBJECT
  15. public:
  16. MainWindow(QWidget* parent = nullptr);
  17. ~MainWindow();
  18. private:
  19. void initMenu();
  20. void initToolBar();
  21. void initConnect();
  22. private:
  23. Ui::MainWindow* ui;
  24. QToolBar* fileToolBar;
  25. QMenu* fileMenu;
  26. QAction* fileOpenAction;
  27. QAction* fileSaveAction;
  28. QToolBar* editToolBar;
  29. QMenu* editMenu;
  30. QAction* editCopyAction;
  31. QAction* editCutAction;
  32. };
  33. #endif // MAINWINDOW_H

实现

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget* parent)
  4. : QMainWindow(parent)
  5. {
  6. this->setWindowTitle("aciton");
  7. this->resize(240, 120);
  8. initMenu();
  9. initToolBar();
  10. initConnect();
  11. }
  12. // 构建菜单栏
  13. void MainWindow::initMenu()
  14. {
  15. // 初始化File菜单
  16. fileMenu = new QMenu(tr("File"), this);
  17. fileOpenAction = new QAction("&Open...", this);
  18. fileSaveAction = new QAction("&Save...", this);
  19. fileMenu->addAction(fileOpenAction);
  20. fileMenu->addAction(fileSaveAction);
  21. // 初始化Edit菜单
  22. editMenu = new QMenu("&Edit");
  23. editCopyAction = editMenu->addAction("&Copy");
  24. QString path = ":/cut.svg";
  25. editCutAction = editMenu->addAction(QIcon(path), "&Cut");
  26. // 设置低优先级(只显示图片 不会显示文字),如果不设置QIcon,则该优先级无效
  27. editCutAction->setPriority(QAction::LowPriority);
  28. // 将菜单添加到菜单栏上
  29. QMenuBar* menuBar = this->menuBar();
  30. menuBar->addMenu(fileMenu);
  31. menuBar->addMenu(editMenu);
  32. }
  33. // 构建工具栏
  34. void MainWindow::initToolBar()
  35. {
  36. // 初始化FileToolBar
  37. fileToolBar = new QToolBar(this);
  38. fileToolBar->addAction(fileOpenAction);
  39. fileToolBar->addAction(fileSaveAction);
  40. // 初始化EditToolBar
  41. editToolBar = new QToolBar(this);
  42. editToolBar->addAction(editCopyAction);
  43. editToolBar->addAction(editCutAction);
  44. // 将工具添加到工具栏上
  45. addToolBar(Qt::TopToolBarArea, fileToolBar);
  46. addToolBar(Qt::TopToolBarArea, editToolBar);
  47. // 设置工具栏为Qt::ToolButtonTextBesideIcon(图标在文字左侧)
  48. this->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
  49. }
  50. // 测试QAction::activate(QAction::ActionEvent)
  51. void MainWindow::initConnect()
  52. {
  53. connect(fileOpenAction, &QAction::triggered, this, [=]() {
  54. // 这将导致fileSaveAction发送信号QAction::hovered()
  55. fileSaveAction->activate(QAction::Hover);
  56. });
  57. connect(fileSaveAction, &QAction::hovered, this, []() {
  58. qDebug("file save action");
  59. });
  60. }
  61. MainWindow::~MainWindow()
  62. {
  63. }

结果

96E`)$4H114LN@CKG57X~G4.png![Z1B@R@O`G4(RC$KUCFHX(A.png