qt添加菜单纯代码_Qt Creator 插件开发(3):添加菜单项

本章我们将学习如何向 Qt Creator 的菜单栏添加内容。在上一章插件的基础之上,我们将尝试开发一个比较正式的插件——在菜单栏中可以看到,并且可以相应用户动作等。

在我们开始之前,我们先来看看 Qt Creator 已有的菜单:

Qt Creator 的默认菜单(部分)是:

File

New

Open

Recent Files

Edit

Advanced

Tools

External

Window

Panes

Views

Help

注意,我们这里只是列出了 Qt Creator 默认的菜单,其它菜单,比如构建和调试,是由插件提供的,而不是 Qt Creator 的默认菜单。为查看这一点,我们可以将 Qt Creator 的“已安装的插件”对话框中所有能去掉的插件全部去掉,重启 Qt Creator 看看效果。

作为一个 Qt 开发人员,我们知道,所有菜单都是在QMenuBar类中提供的,并且有一个QMenu对象与上面各项相关联。

Core::ActionManager

实际上,Qt Creator 主程序仅仅是一个插件加载器。Qt Creator 所提供的所有功能都是通过插件实现的。QtCreator 最主要的一个插件叫做“core”。如果没有这个插件,Qt Creator 就真的什么都不是了(甚至连个插件加载器都不是了)。

“core” 的关键组件是ActionManager。ActionManager 的作用是注册菜单、菜单项以及键盘快捷键。所以,如果我们想要添加新的菜单或菜单项,我们就需要使用ActionManager。我们会在下文详细介绍这个内容。

为了访问到 ActionManager,我们可以使用下面的代码:

#include

#include

Core::ActionManager* am = Core::ICore::instance()->actionManager();

Core::ActionContainer

ActionContianer表示 Qt Creator 中的菜单项或者菜单栏。我们从来不会直接创建ActionContainer的实例,而是通过ActionManager::createMenu()、ActionManager::createMenuBar()这样的函数进行创建。我们会在后文对此进行详细介绍。

Qt Creator 每一个默认菜单都关联一个ActionContainer对象。给定一个菜单,获取其关联的ActionContainer对象,可以使用下面的代码:

#include

#include

#include

#include

Core::ActionManager* am = Core::ICore::instance()->actionManager();

Core::ActionContainer* ac = am->actionContainer( ID );

下面表格给出了 Qt Creator 每个菜单的 ID。这些都是Core命名空间中的静态const char *常量。我们可以在 $$QT_CREATOR_ROOT/src/plugins/coreplugin/coreconstants.h 中找到这些定义。

菜单ID

FileCore::Constants::M_FILE

File -> OpenCore::Constants::M_FILE_OPEN

File -> NewCore::Constants::M_FILE_NEW

File -> Recent FilesCore::Constants::M_FILE_RECENTFILES

EditCore::Constants::M_EDIT

Edit -> AdvancedCore::Constants::M_EDIT_ADVANCED

ToolsCore::Constants::M_TOOLS

Tools -> ExternalCore::Constants::M_TOOLS_EXTERNAL

WindowCore::Constants::M_WINDOW

Window -> PanesCore::Constants::M_WINDOW_PANES

Window -> ViewsCore::Constants::M_WINDOW_VIEWS

HelpCore::Constants::M_HELP

如果我们想要访问“Help”菜单,我们可以使用如下的代码:

#include

#include

#include

#include

Core::ActionManager* am = Core::ICore::instance()->actionManager();

Core::ActionContainer* ac = am->actionContainer( Core::Constants::M_HELP );

添加菜单项

下面,我们重新回到上一章中已经编写完成的 DoNothing 插件。现在,我们希望向“Help”菜单中增加一个 “About DoNothing” 菜单项。于是,我们需要修改 DoNothingPlugin.cpp 文件如下:

#include

#include

#include

#include

bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)

{

Q_UNUSED(args);

Q_UNUSED(errMsg);

Core::ActionManager* am = Core::ICore::instance()->actionManager();

Core::ActionContainer* ac = am->actionContainer(Core::Constants::M_HELP);

QAction* aboutDoNothing = ac->menu()->addAction("About DoNothing");

return true;

}

好了,这样就可以了!“About DoNothing” 此时就已经出现在 “Help” 菜单下,重新编译下我们的插件,然后启动 Qt Creator,看看我们新增的菜单项:

不过,这样做还是有一些缺憾。虽然我们的代码能够正常工作,但是这并不是推荐的做法。Qt Creator 的所有菜单项都应该出现在选择里面的 “Keyboard Shortcuts” 中:

按照我们前面的做法,我们会失望地发现,我们的插件虽然添加了新的菜单项,但并没有在 “Keyboard Shortcuts” 列出。为了达到这一目的,我们需要向 Qt Creator 注册我们的菜单项。

注册菜单项

Core::Command类用于表示一个 action 动作,例如菜单项 menu item、工具按钮 tool button,或者是快捷键 shortcut。我们不应该直接创建Command对象,而是应该使用ActionManager::registerAction()注册一个 action,然后获取返回值,其返回值就是一个Command。这个Command对象表示用户可见的 action 及其属性。

下面代码显示了如何为我们的 DoNothing 插件注册 “About DoNothing” 菜单项:

#include

#include

#include

#include

#include

bool DoNothingPlugin::initialize(const QStringList& args, QString *errMsg)

{

Q_UNUSED(args);

Q_UNUSED(errMsg);

// Fetch the action manager

Core::ActionManager* am = Core::ICore::instance()->actionManager();

// Create a command for "About DoNothing".

Core::Command* cmd = am->registerAction(

new QAction(this),

"DoNothingPlugin.AboutDoNothing",

Core::Context(Core::Constants::C_GLOBAL));

cmd->action()->setText("About DoNothing");

// Add the command to Help menu

am->actionContainer(Core::Constants::M_HELP)->addAction(cmd);

return true;

}

编译运行之后,我们发现 “About DoNothing” 出现在 “Help” 菜单中,但是这次出现在了开始位置。

然后再打开 “Keyboard Shortcuts” 对话框,我们已经能够找到 “About DoNothing”:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android添加hidl,android hidl

1、定义.hal接口文件,如:在vendor/sprd/interface中新建目录hello,其中定义好hidl接口,如:1 package [email protected]1.0;23 interfaceIHello {45 helloWorld(string name) generates (stringresult);67 };2、利用hi…

震惊! Rightmost Digit 快速幂解决

题目 Given a positive integer N, you should output the most right digit of N^N. Input The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case conta…

rrpp协议如何修改_RRPP协议

产生背景在网络规划和实际组网应用中,大多采用环网来提供高可靠性。环网技术简单来说,就是将一些网络设备通过环的形状连接到一起,实现相互通信的一种技术。为了避免环网中产生广播风暴,最初采用了已被普遍应用的STP协议环路保护机…

android handler同步,android解决:使用多线程和Handler同步更新UI

如果运行时,可以看到滚动条由条慢慢变短,则说明程序成功了。截图如下,建议选择大点的文件做测试。main.xmlxmlns:android"http://schemas.android.com/apk/res/android"android:layout_height"wrap_content" android:id&…

hashmap hash冲突怎么解决_HashMap原理及冲突之简谈

了解HashMap原理对于日后的缓存机制多少有些认识。在网络中也有很多方面的帖子,但是很多都是轻描淡写,很少有把握的比较准确的信息,在这里试着不妨说解一二。对于HashMap主要以键值(key-value)的方式来体现,笼统的说就是采用key值…

html5把六张图片做成立方体,HTML5绘制在立方体上的几何曲线图形

CSS语言:CSSSCSS确定body {background: #222;width: 100vw;height: 100vh;overflow: hidden;-webkit-filter: blur(1px);filter: blur(1px);box-sizing: border-box;-webkit-perspective: 3000px;perspective: 3000px;}.cube {position: absolute;width: 250px;heig…

c语言中闰年 日期 天数 统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形

常识: 1、3、5、7、8、10、12月份,每个月31天。2月闰年有29天,非闰年28天其他月份,每月30天 闰年:一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份&#xff0c…

java有啥区别 jsp_Java与JSP有什么区别

Java与JSP的区别有:1、Java是面向对象编程语言,而JSP是一个建立在Java基础上用于开发动态内容的web页面技术;2、Java负责逻辑业务处理,而JSP负责页面展现等等。【推荐课程:Java教程】JAVA是一种编程语言,可…

c++ stl 容器 迭代器 stl用法示例

1.基本概念 1.1容器概述 顺序容器 vector, deque,list关联容器 set, multiset, map, multimap容器适配器 stack, queue, priority_queue 1.1.1迭代器 用于指向顺序容器和关联容器中的元素迭代器用法和指针类似 有const 和非 const两种通过迭代器可以读取它指向的元素通过非…

python julian date_Python 的内嵌time模板翻译及说明

一、简介time模块提供各种操作时间的函数 说明:一般有两种表示时间的方式: 第一种是时间戳的方式(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的 第二种以数组的形式表示即(struct_time),共有九个元素,分别表示,同一个时间戳的st…

html玫瑰花效果代码,html5渲染3D玫瑰花情人节礼物js特效代码

情人节马上就要到来了,这里给程序员前端设计师们献上一个,html5渲染而成的3D玫瑰花js效果,可以作为虚拟的情人节礼物送给自己的爱人。支持html5的浏览器查看。查看演示下载资源:16次 下载资源下载积分:20积分情人节玫瑰…

跳跃游戏(数组下标跳跃)

给定一个非负整数数组,假定你的初始位置为数组第一个下标。 数组中的每个元素代表你在那个位置能够跳跃的最大长度。 请确认你是否能够跳跃到数组的最后一个下标。 例如:A [2,3,1,1,4]A[2,3,1,1,4] 能够跳跃到最后一个下标,输出true&…

qc中的流程图怎么画_QC流程图参考

华北工控股份有限公司QC流程图样件试产量产文件编号:WI-MED-000FIC-G009版本:A0修改日期:客户:常规品机种:pcba适用工序:IQC/SMT/DIP/OQC/TEST/PACK审核:批准:检验方法检验频率记录担当负责人在制品完成品11确认型号、数量依送货单核对型号/数量仓库检查…

html 页面怎么加载富文本,UILabel加载html富文本

本文主要解决html标签之外文本属性设置当APP里面有搜索的需求的时候,产品可能会要求关键字显示特殊颜色或者字体。其中一种可能性是服务器返回的数据是带有html标签的字符串,那么该怎么解决?当标签之外的其他字体也需要设置不同格式&#xff…

python 打印皮卡丘_用python打印你的宠物小精灵吧

我们来通过一个有趣的例子开始编写我们的第一个python代码。本文涉及的python基础语法为:print输出函数,赋值,字符串print()print()是python的一个内置函数,用于打印输出,是最常见的一个函数之一。有些朋友可能对于打印…

最大子阵列

在一个数组中找出和最大的连续几个数。(至少包含一个数) 例如: 数组A[] [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6. 输入格式 第一行输入一个不超过1000的整数n。 第二行输入n个整数A[i]。…

html嵌入原始数据,如何用html和javascript显示原始图像数据?

我有一个ajax应用程序,PHP端将来自摄像头的未编码的原始图像数据发送到客户端javascript端.我想使用img或canvas标签通过html和javascript显示图像.图像数据是32 * 32无符号字符.我想做,无论达到我的目标(编码或其他所有),但我想在客户端做,因为我无法处理服务器端的任何其他操…

三值排序

排序是一种很频繁的计算任务。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程序计算出,计算出的一个包括1、2、3三种值的数字序列&#…

imgaug批量椒盐噪声 python_python图像扩增-imgaug

# encodingutf-8import osimport imageioimport randomimport numpy as npimport imgaug as iaimport concurrent.futuresfrom imgaug import augmenters as iaaimport matplotlib.pyplot as pltfrom argparse import ArgumentParseria.seed(4)# %matplotlib inline# 参考 http…

express html文件接收路由参数,express 获取post 请求参数

在 Express 中没有内置获取表单 POST 请求体的 API , 我们需要添加第三方插件库安装:npm install --save body-parser配置:var bodyParser require(body-parser)//配置 body-parser 中间件 (插件, 专门用来解析表单 POST 请求)// parse application/x-www-form-urlencodedapp.…