文档章节

Qt学习之路(12): 菜单和工具条

小代码2016
 小代码2016
发布于 2015/05/27 15:25
字数 1418
阅读 12
收藏 0
在前面的QMainWindow的基础之上,我们开始着手建造我们的应用程序。虽然现在已经有一个框架,但是,确切地说我们还一行代码没有写呢!下面的工作就不那么简单了!在这一节里面,我们要为我们的框架添加菜单和工具条。
 
就像Swing里面的Action一样,Qt里面也有一个类似的类,叫做QAction。顾名思义,QAction类保存有关于这个动作,也就 是action的信息,比如它的文本描述、图标、快捷键、回调函数(也就是信号槽),等等。神奇的是,QAction能够根据添加的位置来改变自己的样子 ——如果添加到菜单中,就会显示成一个菜单项;如果添加到工具条,就会显示成一个按钮。这也是为什么要把菜单和按钮放在一节里面。下面开始学习!
 
首先,我想添加一个打开命令。那么,就在头文件里面添加一个私有的QAction变量:
 
class QAction;
//...
private:
        QAction *openAction;
//...
 
注意,不要忘记QAction类的前向声明哦!要不就会报错的!
 
然后我们要在cpp文件中添加QAction的定义。为了简单起见,我们直接把它定义在构造函数里面:
 
        openAction = new QAction(tr( "&Open"), this);
        openAction->setShortcut(QKeySequence::Open);
        openAction->setStatusTip(tr( "Open a file."));
 
第一行代码创建一个QAction对象。QAction有几个重载的构造函数,我们使用的是
 
QAction( const QString &text, QObject* parent);
 
这一个。它有两个参数,第一个text是这个动作的文本描述,用来显示文本信息,比如在菜单中的文本;第二个是parent,一般而言,我们通 常传入this指针就可以了。我们不需要去关心这个parent参数具体是什么,它的作用是指明这个QAction的父组件,当这个父组件被销毁时,比如 delete或者由系统自动销毁,与其相关联的这个QAction也会自动被销毁。
 
如果你还是不明白构造函数的参数是什么意思,或者说想要更加详细的了解QAction这个类,那么就需要自己翻阅一下它的API文档。前面说过 有关API的使用方法,这里不再赘述。这也是学习Qt的一种方法,因为Qt是一个很大的库,我们不可能面面俱到,因此只为说道用到的东西,至于你自己想要 实现的功能,就需要自己去查文档了。
 
第二句,我们使用了setShortcut函数。shortcut是这个动作的快捷键。Qt的QKeySequence已经为我们定义了很多内 置的快捷键,比如我们使用的Open。你可以通过查阅API文档获得所有的快捷键列表,或者是在QtCreator中输入::后会有系统的自动补全功能显 示出来。这个与我们自己定义的有什么区别呢?简单来说,我们完全可以自己定义一个tr("Ctrl+O")来实现快捷键。原因在于,这是Qt跨平台性的体 现。比如PC键盘和Mac键盘是不一样的,一些键在PC键盘上有,而Max键盘上可能并不存在,或者反之,所以,推荐使用QKeySequence类来添 加快捷键,这样,它会根据平台的不同来定义不同的快捷键。
 
第三句是setStatusTip函数。这是添加状态栏的提示语句。状态栏就是主窗口最下面的一条。现在我们的程序还没有添加状态栏,因此你是看不到有什么作用的。
 
下面要做的是把这个QAction添加到菜单和工具条:
 
        QMenu *file = menuBar()->addMenu(tr( "&File"));
        file->addAction(openAction);

        QToolBar *toolBar = addToolBar(tr( "&File"));
        toolBar->addAction(openAction);
 
QMainWindow有一个menuBar()函数,会返回菜单栏,也就是最上面的那一条。如果不存在会自动创建,如果已经存在就返回那个菜 单栏的指针。直接使用返回值添加一个菜单,也就是addMenu,参数是一个QString,也就是显示的菜单名字。然后使用这个QMenu指针添加这个 QAction。类似的,使用addToolBar函数的返回值添加了一个工具条,并且把这个QAction添加到了上面。
 
好了,主要的代码已经写完了。不过,如果你只修改这些的话,是编译不过的哦!因为像menuBar()函数返回一个QMenuBar指针,但是 你并没有include它的头文件哦!虽然没有明着写出QMenuBar这个类,但是实际上你已经用到了它的addMenu函数了,所以还是要注意的!
 
下面给出来全部的代码:
 
1. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>

class QAction;

class MainWindow : public QMainWindow
{
        Q_OBJECT

public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();

private:
        QAction *openAction;
};

#endif // MAINWINDOW_H
 
2. mainwindow.cpp
 
#include <QtGui/QAction>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QKeySequence>
#include <QtGui/QToolBar>
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
{
        openAction = new QAction(tr( "&Open"), this);
        openAction->setShortcut(QKeySequence::Open);
        openAction->setStatusTip(tr( "Open a file."));

        QMenu *file = menuBar()->addMenu(tr( "&File"));
        file->addAction(openAction);

        QToolBar *toolBar = addToolBar(tr( "&File"));
        toolBar->addAction(openAction);
}

MainWindow::~MainWindow()
{

}
 
main.cpp没有修改,这里就不给出了。下面是运行结果:
 
 
很丑,是吧?不过我们已经添加上了菜单和工具条了哦!按一下键盘上的Alt+F,因为这是我们给它定义的快捷键。虽然目前挺难看,不过以后就会变得漂亮的!想想看,Linux的KDE桌面可是Qt实现的呢!

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/205034

本文转载自:http://devbean.blog.51cto.com/448512/205034

小代码2016
粉丝 46
博文 328
码字总数 153495
作品 0
安阳
程序员
私信 提问
Qt creator写Qt入门程序(超详细)

废话一下。第一、Qt是跨平台的,在windows下和Linux基本上是没什么区别的,只要用的是Qt带的库就可以。 第二、Qt c++编程和学校学的c++还有有一点区别的,学校学的c++是基础知识,Qt c++编程...

startstorm
2015/09/05
433
0
qwidget qmainwindow qdialog 简要区别

原文网址: http://zxwmail.blog.163.com/blog/static/120947384201010611017114/ QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事...

racoon
2011/05/15
212
0
关于Qt5里的两个问题

第一个问题是 Qt学习之路47 里的booleanmodel.cpp文件 基类是QAbstractItemModel 有人说Qt5没有reset()函数,不知道有什么代替的。 第二个问题是 Qt学习之路48 里代码全部模仿的一样 错误: ...

李新浩
2014/03/06
248
0
收藏的博客 -- Qt/C++学习

Qt下载官网 http://download.qt.io/ Qt知名社区 http://www.qtcn.org/bbs/i.php http://www.qter.org/ Qt知名博客 https://www.devbean.net/ --- Qt学习之路,Qt Creator源码学习 http://blo......

libaineu2004
2017/08/18
0
0
4 个 Markdown 开源编辑器

如果你正在寻找一种简便的方法去格式化 Markdown 文本,那么这些编辑器可能会满足你的需求。 我的文章、散文、博客等等基本上都是在文本编辑器上使用 Markdown 写作的。当然,我不是唯一使用...

作者: Scott Nesbitt
2018/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Alibaba 实战(二) - 关于Spring Boot你不可不知道的实情

0 相关源码 1 什么是Spring Boot 一个快速开发的脚手架 作用 快速创建独立的、生产级的基于Spring的应用程序 特性 无需部署WAR文件 提供starter简化配置 尽可能自动配置Spring以及第三方库 ...

JavaEdge
今天
7
0
TensorFlow 机器学习秘籍中文第二版(初稿)

TensorFlow 入门 介绍 TensorFlow 如何工作 声明变量和张量 使用占位符和变量 使用矩阵 声明操作符 实现激活函数 使用数据源 其他资源 TensorFlow 的方式 介绍 计算图中的操作 对嵌套操作分层...

ApacheCN_飞龙
今天
7
0
五、Java设计模式之迪米特原则

定义:一个对象应该对其他对象保持最小的了解,又叫最小知道原则 尽量降低类与类之间的耦合 优点:降低类之间的耦合 强调只和朋友交流,不和陌生人说话 朋友:出现在成员变量、方法的输入、输...

东风破2019
昨天
23
0
jvm虚拟机结构

1:jvm可操作数据类型分为原始类型和引用类型,因此存在原始值和引用值被应用在赋值,参数,返回和运算操作中,jvm希望在运行时 明确变量的类型,即编译器编译成class文件需要对变量进行类型...

xpp_ba
昨天
5
0
聊聊nacos Service的processClientBeat

序 本文主要研究一下nacos Service的processClientBeat Service.processClientBeat nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/Service.java public class Service ex......

go4it
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部