本节,咱们将在前面主窗口基础之上,添加菜单和工具栏等的动做。虽然 Qt Creator 已经帮咱们实现了主窗口的框架代码,可是具体的功能,仍是须要咱们一行行添加。框架
Qt 使用QAction
类做为动做。顾名思义,这个类就是表明了窗口的一个“动做”,这个动做可能显示在菜单,做为一个菜单项,当用户点击该菜单项,对用户的点击作出响应;也可能在工具栏,做为一个工具栏按钮,用户点击这个按钮就能够执行相应的操做。有一点值得注意:不管是出如今菜单栏仍是工具栏,用户选择以后,所执行的动做应该都是同样的。所以,Qt 并无专门的菜单项类,只是使用一个QAction
类,抽象出公共的动做。当咱们把QAction
对象添加到菜单,就显示成一个菜单项,添加到工具栏,就显示成一个工具按钮。用户能够经过点击菜单项、点击工具栏按钮、点击快捷键来激活这个动做。函数
QAction
包含了图标、菜单文字、快捷键、状态栏文字、浮动帮助等信息。当把一个QAction
对象添加到程序中时,Qt 本身选择使用哪一个属性来显示,无需咱们关心。同时,Qt 可以保证把QAction
对象添加到不一样的菜单、工具栏时,显示内容是同步的。也就是说,若是咱们在菜单中修改了QAction
的图标,那么在工具栏上面这个QAction
所对应的按钮的图标也会同步修改。工具
下面咱们来看看如何在QMainWindow
中使用QAction
:this
// !!! 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()
函数,将这个QAction
的triggered()
信号与MainWindow
类的open()
函数链接起来。当用户点击了这个QAction
时,会自动触发MainWindow
的open()
函数。这是咱们以前已经了解过的。
下面的menuBar()
、toolBar()
和statusBar()
三个是QMainWindow
的函数,用于建立并返回菜单栏、工具栏和状态栏。咱们能够从代码清楚地看出,咱们向菜单栏添加了一个 File 菜单,而且把这个QAction
对象添加到这个菜单;同时新增长了一个 File 工具栏,也把QAction
对象添加到了这个工具栏。咱们能够看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变成了一个按钮。至于状态栏,则是出如今窗口最下方,用于显示动做对象的提示信息的。