【Qt笔记】添加动做

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

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

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

下面咱们来看看如何在QMainWindow中使用QActionthis

// !!! 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 <QStatusBar>
#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);

    statusBar() ;
}

MainWindow::~MainWindow()
{
}

void MainWindow::open()
{
    QMessageBox::information(this, tr("Information"), tr("Open"));
}


//main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

点击运行,能够看到MainWindow的运行结果:指针

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

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

图标咱们使用了QIcon,传入值是一个字符串,是图标的名称,表示在当前路径下的图标。对象

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

下面一句,咱们使用了setShortcut()函数,用于说明这个QAction的快捷键。Qt 的QKeySequence为咱们定义了不少内置的快捷键,好比咱们使用的 Open。你能够经过查阅 API 文档得到全部的快捷键列表。 这个与咱们本身定义的有什么区别呢?简单来讲,咱们彻底能够本身定义一个tr("Ctrl+O")来实现快捷键。缘由在于,这是 Qt 跨平台性的体现。好比 PC 键盘和 Mac 键盘是不同的,一些键在 PC 键盘上有,而 Mac 键盘上可能并不存在,或者反之。使用QKeySequence类来添加快捷键,会根据平台的不一样来定义相应的快捷键。文档

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

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

下面的menuBar()toolBar()statusBar()三个是QMainWindow的函数,用于建立并返回菜单栏、工具栏和状态栏。咱们能够从代码清楚地看出,咱们向菜单栏添加了一个 File 菜单,而且把这个QAction对象添加到这个菜单;同时新增长了一个 File 工具栏,也把QAction对象添加到了这个工具栏。咱们能够看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变成了一个按钮。至于状态栏,则是出如今窗口最下方,用于显示动做对象的提示信息的。

相关文章
相关标签/搜索