QAction 类表示用户命令的一种抽象,包括命令文本、图标、命令触发后要执行的代码。菜单、工具栏按钮往往存在相同的功能,将这些命令独立抽出来,放到 QAction 以象上,可避免编写重复的代码。比如“文件”菜单下有“保存”命令,工具栏上也会有“保存”按钮。因此,创建一个表示“保存”的 QAction 对象,同时添加到菜单和工具栏中,它们就能共享相同的功能。
以上F话了这么多,就是为了明确 QAction 类的作用。在创建 QAction 实例时,可以通过构造函数传递命令的文本,或图标。如果在调用构造函数时不指定,那么可以用下面这些方法来“补做”:
1、setText 方法:设置命令文本。显示在用户界面上的文本;
2、setIcon 方法:看名识义,就是设置图标;
3、setFont 方法:在呈现命令文本时用的字体。一般不需要特意去指定字体,它会继承应用程序的默认字体;
4、setShortcut:设置命令的快捷键。
QAction 类有个核心的信号:triggered,当用户通过点击或快捷键激活菜单项或工具栏按钮,就会发出 triggered 信号。
下面咱们做个简单的例子。这里我用到了 QMainWindow 类来充当主窗口,因为它的“窗口功能”比较完善,创建个菜单栏、工具栏和状态栏的都比较方便。
CMake 文件:
cmake_minimum_required(VERSION 3.20) # 项目 project(myApp VERSION 1.0.0 LANGUAGES CXX) find_package(Qt6 REQUIRED COMPONENTS Gui Core Widgets) # 开启MOC set(CMAKE_AUTOMOC ON) # 语言标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 源文件 add_executable(app WIN32 me.cpp) target_link_libraries(app PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets)
me.cpp 文件:
#include <QApplication> #include <QMainWindow> #include <QMenuBar> #include <QMessageBox> #include <QMenu> #include <QAction> #include <QIcon> // 这三个逗丁用来接收信号的,slot 函数 void onNew(); void onSave(); void onExit(); int main(int argc, char** argv) { QApplication app(argc,argv); // 创建主窗口 QMainWindow win; // 窗口标题 win.setWindowTitle("整活儿"); // 这样获取,默认会创建空的菜单栏 QMenuBar* menubar = win.menuBar(); // 添加“文件”菜单 QMenu* fileMenu = menubar -> addMenu("文件"); // 创建三个QAction对象 QAction *act1 = new QAction("新建", &win); QAction *act2 = new QAction("保存", &win); QAction *act3 = new QAction("退出", &win); // 连接triggered信号 QObject::connect(act1, &QAction::triggered, &onNew); QObject::connect(act2, &QAction::triggered, &onSave); QObject::connect(act3, &QAction::triggered, &onExit); // 把三个action添加到菜单中 fileMenu->addAction(act1); fileMenu->addAction(act2); fileMenu->addAction(act3); // 显示主窗口 win.show(); // 进入事件循环 return QApplication::exec(); } void onNew() { QMessageBox::information(nullptr, "提示", "新建文件"); } void onSave() { QMessageBox::information(nullptr, "提示", "保存文件"); } void onExit() { QApplication::exit(); }
QMainWindow 的 menuBar 方法用来获取菜单栏(QMenuBar)引用的。但,当窗口中未设置过菜单栏时,它会自动创建一个空菜单栏,并将其引用返回。返回的 QMenu 对象表示菜单,调用它的 addAction 方法就能添加菜单项了。菜单项用 QAction 表示。
onNew、onSave、onExit 这三个函数分别作为三个 QAction 对象的 slot 函数,接收 triggered 信号。
运行后,你会看到,QAction 对象指定的文本,会自动呈现在菜单文本中。
通常,为了让菜单命令更直观,咱们会在重要的菜单项上加上图标。接下来给上述三个 action 添上小图标。这里老周介绍一个获取图标的网站,很好用,要啥图标,进去后直接搜索就行,而且可以选择多尺寸下载。比那些要强制登录才能用的骚站好很多。
浏览器打开 Download 1,301,500 free icons (SVG, PNG) (icons8.com)
菜单上的图标,用 16×16 就够了。把图标文件放在与应用程序可执行文件相同的路径下,依次命名为 new.png、save.png、exit.png。
接着,改一下代码,需要用 QAction 带 QIcon 参数的构造函数。
QAction *act1 = new QAction(QIcon("new.png"), "新建", &win); QAction *act2 = new QAction(QIcon("save.png"), "保存", &win); QAction *act3 = new QAction(QIcon("exit.png"), "退出", &win);
再次编译,运行,效果如下:
对于常用的命令,有快捷键能大大提升效率。快捷键需要用到 QKeySequence 类。该类在 QtGui 基础模块中。这个类在调用构造函数时有一种特特简单的用法,就是直接用字符串来描述快捷键。