Qt :添加动作

本节,我们将在前面主窗口基础之上,添加菜单和工具栏等的动作。虽然 Qt Creator 已经帮我们实现了主窗口的框架代码,但是具体的功能,还是需要我们一行行添加。

Qt 使用 QAction 类作为动作。顾名思义,这个类就是代表了窗口的一个“动作”,这个动作可能显示在菜单,作为一个菜单项,当用户点击该菜单项,对用户的点击做出响应;也可能在工具栏,作为一个工具栏按钮,用户点击这个按钮就可以执行相应的操作。有一点值得注意:无论是出现在菜单栏还是工具栏,用户选择之后,所执行的动作应该都是一样的。因此,Qt 并没有专门的菜单项类,只是使用一个 QAction 类,抽象出公共的动作。当我们把 QAction 对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动作。

QAction 包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息。当把一个 QAction 对象添加到程序中时,Qt 自己选择使用哪个属性来显示,无需我们关心。同时,Qt 能够保证把 QAction 对象添加到不同的菜单、工具栏时,显示内容是同步的。也就是说,如果我们在菜单中修改了 QAction 的图标,那么在工具栏上面这个 QAction 所对应的按钮的图标也会同步修改。

下面我们来看看如何在 QMainWindow 中使用 QAction:

// !!! Qt 5
// ========== mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    void open();
 
    QAction *openAction;
};
 
#endif // MAINWINDOW_H
 
// ========== mainwindow.cpp
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QToolBar>
 
#include "mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setWindowTitle(tr("Main Window"));
 
    openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
    openAction->setShortcuts(QKeySequence::Open);
    openAction->setStatusTip(tr("Open an existing file"));
    connect(openAction, &QAction::triggered, this, &MainWindow::open);
 
    QMenu *file = menuBar()->addMenu(tr("&File"));
    file->addAction(openAction);
 
    QToolBar *toolBar = addToolBar(tr("&File"));
    toolBar->addAction(openAction);
}
 
MainWindow::~MainWindow()
{
}
 
void MainWindow::open()
{
    QMessageBox::information(this, tr("Information"), tr("Open"));
}

上面的代码分别属于两个文件:mainwindow.h 和 mainwindow.cpp。为了让 MainWindow 运行起来,我们还需要修改 main() 函数如下:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    MainWindow win;
    win.show();
 
    return app.exec();
}

当我们编辑好文件,点击运行,可以看到 MainWindow 的运行结果:

Main Window with Action

这是一个相对完整的程序。首先,我们在 MainWindow 类中添加了一个私有函数 open() 和一个私有变量 openAction。在 MainWindow 的构造函数中,第一行我们调用了 setWindowTitle(),设置主窗口的标题。注意我们的文本使用 tr() 函数,这是一个用于 Qt 国际化的函数。在后续章节中我们可以看到,我们可以使用 Qt 提供的国际化工具,将 tr() 函数的字符串提取出来,进行国际化。由于所需进行国际化的文本应该被大多数人认识,所以,tr() 函数里面一般会是英文文本。

然后,我们在堆上创建了 openAction 对象。在 QAction 构造函数,我们传入了一个图标、一个文本和 this 指针。我们将在后面的文章中解释 this 指针的含义。

图标我们使用了 QIcon,传入值是一个字符串,这个字符串对应于 Qt 资源文件中的一段路径。Qt 资源文件的后缀名是 qrc。如果我们使用 Qt Creator,我们可以在新建文件中看到 Qt 资源文件。Qt 资源文件其实是一个 XML 描述的文件,表示 Qt 应用程序所需要的各个资源。我们可以使用普通文本编辑器打开这个文件:

<RCC>
    <qresource prefix="/images">
        <file alias="doc-open">document-open.png</file>
    </qresource>
</RCC>

我们会在后面的章节中详细介绍 Qt 资源文件(注意,资源文件需要在 pro 文件中使用 RESOURCES 引入。)。这里只需要了解,QIcon 的参数,以 : 开始,意味着从资源文件中查找资源。:/images/doc-open 就是找到了这里的 document-open.png 这个文件。(我们使用的是 png 格式的图片,这是 Qt 内置支持的图片格式。其他格式的图片,比如 jpg、gif 则需要插件支持。这些插件实际已经随着 Qt 一同发布。)

QAction 第二个参数中,文本值前面有一个 &,意味着这将成为一个快捷键。注意看截图中 File 的 F 有一个下划线。

下面一句,我们使用了 setShortcut() 函数,用于说明这个 QAction 的快捷键。Qt 的 QKeySequence 为我们定义了很多内置的快捷键,比如我们使用的 Open。你可以通过查阅 API 文档获得所有的快捷键列表。 这个与我们自己定义的有什么区别呢?简单来说,我们完全可以自己定义一个 tr(“Ctrl+O”) 来实现快捷键。原因在于,这是 Qt 跨平台性的体现。比如 PC 键盘和 Mac 键盘是不一样的,一些键在 PC 键盘上有,而 Mac 键盘上可能并不存在,或者反之。使用 QKeySequence 类来添加快捷键,会根据平台的不同来定义相应的快捷键。

setStatusTip() 则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。

后面的 connect() 函数,将这个 QAction 的 triggered() 信号与 MainWindow 类的 open() 函数连接起来。当用户点击了这个 QAction 时,会自动触发 MainWindow 的 open() 函数。这是我们之前已经了解过的。

下面的 maneBar() 和 toolBar() 两个是 QMainWindow 的函数,用于创建并返回菜单栏和工具栏。我们可以从代码清楚地看出,我们向菜单栏添加了一个 File 菜单,并且把这个 QAction 对象添加到这个菜单;同时新增加了一个 File 工具栏,也把 QAction 对象添加到了这个工具栏。我们可以看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变成了一个按钮。

至于 open() 函数中的内容,我们会在后文介绍。这里可以运行一下,你会看到,触发这个动作,程序会弹出一个提示框。

下面是 Qt 4 版本的程序,具体非常类似,这里不再赘述。

// !!! Qt 4
// ========== mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void open();
 
private:
    QAction *openAction;
};
 
#endif // MAINWINDOW_H
 
// ========== mainwindow.cpp
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QToolBar>
 
#include "mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setWindowTitle(tr("Main Window"));
 
    openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
    openAction->setShortcuts(QKeySequence::Open);
    openAction->setStatusTip(tr("Open an existing file"));
    connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
 
    QMenu *file = menuBar()->addMenu(tr("&File"));
    file->addAction(openAction);
 
    QToolBar *toolBar = addToolBar(tr("&File"));
    toolBar->addAction(openAction);
}
 
MainWindow::~MainWindow()
{
}
 
void MainWindow::open()
{
    QMessageBox::information(this, tr("Information"), tr("Open"));
}

<think>嗯,用户想在Qt中向工具栏添加动作,我需要给出示例代码和教程。首先,得回忆一下Qt中关于工具栏和QAction的相关知识。记得QToolBar是用来创建工具栏的,而QAction是可以在菜单和工具栏之间共享的动作。 根据引用[2],同一个QAction可以同时添加到菜单和工具栏,这样用户操作一个动作就能同时更新两个地方的状态。比如,在菜单里添加一个“打开”动作,工具栏里也放同一个动作,这样点击工具栏按钮和菜单项效果一样。 那具体步骤应该是怎样的呢?首先,可能需要创建一个QToolBar对象,然后使用addToolBar方法把它添加到主窗口。接着创建QAction,设置图标、文本、快捷键等属性,再把QAction添加到工具栏里。记得连接信号和槽,比如触发action时执行某个函数。 示例代码部分,可能需要用到QAction的创建,比如new QAction,然后设置图标,可能用QIcon来加载资源。然后工具栏的addAction方法添加这个动作。另外,引用[4]里的代码有connect的部分,说明需要连接clicked信号到对应的槽函数,比如lambda表达式里执行操作。 还要注意,工具栏可能需要添加到主窗口的某个位置,比如顶部。引用[3]提到在.ui文件中设计,但用户可能需要代码实现的示例。不过可以同时提到用设计器和代码两种方法。 此外,引用[5]提到了制作运行图标,所以可能需要说明如何为QAction设置图标,使用资源文件或者直接路径。比如,使用QPixmap或者QIcon来加载图片。 可能的问题点:用户可能不知道如何共享QAction,或者如何正确连接信号。需要强调QAction的共享性,即一个action可以添加到多个地方。同时,代码中的connect部分要正确,比如使用QPushButton的点击信号,或者QAction的triggered信号。 总结步骤应该是:创建工具栏、创建QAction并配置、添加到工具栏、连接信号和槽。示例代码需要包含这些步骤,并确保语法正确,比如使用正确的头文件,正确的对象创建方式。 可能还需要提到状态栏,引用[2]中提到了状态栏,但用户的问题是关于工具栏的,所以可能不需要深入,但可以简要说明如何显示提示信息,比如setStatusTip。 最后,生成相关问题需要考虑用户可能进一步的问题,比如如何添加图标、如何响应动作、如何自定义工具栏样式等。</think>### 如何在 Qt 中为工具栏添加 Action #### 分步实现方法 1. **创建工具栏对象** 使用 `QToolBar` 类创建工具栏,并通过 `addToolBar()` 将其添加到主窗口。例如: ```cpp QToolBar* toolbar = new QToolBar("主工具栏"); addToolBar(Qt::TopToolBarArea, toolbar); // 将工具栏放置在窗口顶部 ``` 2. **定义 QAction 并配置属性** 创建 `QAction` 对象并设置图标、文本、快捷键等属性: ```cpp QAction* openAction = new QAction(QIcon(":/icons/open.png"), "打开"); openAction->setShortcut(QKeySequence::Open); // 设置快捷键为 Ctrl+O openAction->setStatusTip("打开文件"); // 状态栏提示[^2] ``` 3. **将 Action 添加到工具栏** 通过 `addAction()` 方法将动作添加到工具栏: ```cpp toolbar->addAction(openAction); // 添加打开动作到工具栏 ``` 4. **连接信号与槽函数** 使用 `connect()` 绑定动作触发事件: ```cpp connect(openAction, &QAction::triggered, this, &MainWindow::handleOpen); ``` #### 完整示例代码 ```cpp // MainWindow.h #include <QMainWindow> #include <QAction> #include <QToolBar> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget* parent = nullptr); private slots: void handleOpen(); private: QToolBar* toolbar; QAction* openAction; }; // MainWindow.cpp MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { // 创建工具栏 toolbar = new QToolBar("主工具栏"); addToolBar(Qt::TopToolBarArea, toolbar); // 创建并配置动作 openAction = new QAction(QIcon(":/icons/open.png"), "打开", this); openAction->setShortcut(QKeySequence::Open); openAction->setStatusTip("打开文件"); // 状态栏提示[^2] // 添加到工具栏 toolbar->addAction(openAction); // 连接信号与槽 connect(openAction, &QAction::triggered, this, &MainWindow::handleOpen); } void MainWindow::handleOpen() { qDebug() << "打开操作被触发"; } ``` #### 关键特性说明 - **动作共享**:同一个 `QAction` 可同时添加到菜单和工具栏 - **资源管理**:图标路径 `":/icons/open.png"` 需提前在 `.qrc` 资源文件中定义[^3] - **状态反馈**:通过 `setStatusTip()` 实现操作提示,需配合状态栏使用[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值