ITKeyword,专注技术干货聚合推荐

注册 | 登录

QT5 学习之路12---添加动作

gusgao 分享于 2015-10-03

推荐:QT5 学习之路10---Qt 模块简介

Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改。Qt 5 引入了模块化的概念,将众多功能细分到几个模块之中。Qt 4 也有模块的概念,但是是一种很粗的划分,

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

本节,我们将在前面主窗口基础之上,添加菜单和工具栏等的动作。虽然 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 class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: void open(); QAction *openAction; }; endif // MAINWINDOW_H // ========== mainwindow.cpp include include include include include 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”)); } “`上面的代码分别属于两个文件:mainwindow.h 和 mainwindow.cpp。为了让 MainWindow 运行起来,我们还需要修改 main() 函数如下: int main(int argc, char *argv[]){

QApplication app(argc, argv);

MainWindow win;

win.show();

return app.exec();} 当我们编辑好文件,点击运行,可以看到MainWindow的运行结果: 这是一个相对完整的程序。首先,我们在MainWindow类中添加了一个私有函数open()和一个私有变量openAction。在 MainWindow 的构造函数中,第一行我们调用了setWindowTitle(),设置主窗口的标题。注意我们的文本使用tr()函数,这是一个用于 Qt 国际化的函数。在后续章节中我们可以看到,我们可以使用 Qt 提供的国际化工具,将tr()函数的字符串提取出来,进行国际化。由于所需进行国际化的文本应该被大多数人认识,所以,tr()函数里面一般会是英文文本。 然后,我们在堆上创建了openAction对象。在QAction构造函数,我们传入了一个图标、一个文本和 this 指针。我们将在后面的文章中解释 this 指针的含义。 图标我们使用了QIcon,传入值是一个字符串,这个字符串对应于 Qt 资源文件中的一段路径。Qt 资源文件的后缀名是 qrc。如果我们使用 Qt Creator,我们可以在新建文件中看到 Qt 资源文件。Qt 资源文件其实是一个 XML 描述的文件,表示 Qt 应用程序

推荐:QT5 学习之路19---深入 Qt5 信号槽新语法

在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号槽新语法。由于这次改动很大,许多以前看起来不是问题的问题接踵而来,因此,我们用单

所需要的各个资源。我们可以使用普通文本编辑器打开这个文件: <RCC>

<qresource prefix="/images">

<file alias="doc-open">document-open.png</file>

</qresource></RCC>```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()函数。这是我们之前已经了解过的。下面的menuBar()、toolBar()和statusBar()三个是QMainWindow的函数,用于创建并返回菜单栏、工具栏和状态栏。我们可以从代码清楚地看出,我们向菜单栏添加了一个 File 菜单,并且把这个QAction对象添加到这个菜单;同时新增加了一个 File 工具栏,也把QAction对象添加到了这个工具栏。我们可以看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变成了一个按钮。至于状态栏,则是出现在窗口最下方,用于显示动作对象的提示信息的。至于open()函数中的内容,我们会在后文介绍。这里可以运行一下,你会看到,触发这个动作,程序会弹出一个提示框。下面是 Qt 4 版本的程序,具体非常类似,这里不再赘述。<div class="se-preview-section-delimiter"></div> 这里写代码片 “` // !!! Qt 4// ========== mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {

Q_OBJECTpublic:

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);

statusBar();}MainWindow::~MainWindow(){}void MainWindow::open(){

QMessageBox::information(this, tr("Information"), tr("Open"));}

推荐:QT5 学习之路07---QT5事件

1 小项目 2基本介绍 事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件

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

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。