开始玩qt,使用代码修改设计模式生成的菜单
之前制作菜单时,不是纯代码便是用设计模式 直接图形化完成。
今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成;
但通过设计模式完成的没有暴露指针给我,至少我没发现。
在几次尝试未果之后看了看 qmenubar qmenu qaction的继承关系,发现事情并没那么简单。
无论是从菜单选项还是从设计模式 的对象面板上看
无一不是 qmenubar->qmenu->qaction
其实并不是, qmenubar 和qmenu都是继承于qwidget
而qaction是直接继承于qobject,qwidget 也继承了qobject
所以 qmenubar 和qmenu 都可以使用actions()函数 来获得 action的集合。
因此:
代码应该是这样
auto menu01= menuBar()->addMenu(tr("测试QMenu")); //添加菜单项
menu01->addAction(tr("测试QMenu_Action01")); //在菜单项下面添加动作
menu01->addAction(tr("测试QMenu_Action02"));
auto itact= menu01->actions().begin(); //调用actions() 获得当前菜单项(也是widget)的动作action
(*itact)->setText(tr("修改ActionText")); //修改
注意:在代码中构建的新菜单项默认位于设计模式构建的菜单项后面
一切都很成功!
那么问题来了:
qmenubar 和qmenu 都是qwidget的派生类 都可以使用actions方法。
但我们都知道 action是挂在qmenu下面的
但这里qmenubar调用actions() 是个什么鬼呢?
讲道理返回的是一个qlist<qaction*> 容器才是啊
这里我试验过,
auto it= menuBar()->actions().begin();
(*it)->setText(tr("测试Action"));
it++;
(*it)->setText(tr("测试Action01"));
it++;
(*it)->setText(tr("测试Action02"));
通过设计模式 构建了3个菜单项,如上代码依次遍历修改 三个菜单项都被成功修改.
讲道理这个应该是非法的,因为类型不对。除非有从QMenu到QAction的转换构造。所以我查了下api 发现有一个函数:

是不是因为这个函数才使得actions()成功调用?
menu01->menuAction()->setText(tr("这是哪个action?"));
结果是变更了QMenu的text属性,而其关联的action 并未受到影响.
此外,直接
auto menuAct= menuBar()->addAction(tr("barAction"));
得到效果就是多出一个菜单项 和addMenu一模一样··
那么action 和menu、menubar到底是什么关系呢?
查阅api,
QAction *QMenu::addMenu(QMenu *menu)
This convenience function adds menu as a submenu to this menu. It returns menu's menuAction(). This menu does not take ownership of menu.
说了将 菜单作为这个菜单( *menu) 的子菜单添加,返回菜单的menuAction(),就是它调用了 menuAction()这个函数,Returns the action associated with this menu.
就是说返回菜单相关的action 于是 这里就是返回一个QAtion* QAction类的描述有说到:
There are four kinds of action items:
separators, actions that show a submenu, widgets, and actions that perform an action.
Separators are inserted with addSeparator(), submenus with addMenu(),
and all other items are considered action items. 有四种操作项:分隔符、显示子菜单、小部件和执行操作的动作的操作。分隔符被插入add分隔符()、带有addMenu()的子菜单,所有其他项都被认为是操作项。
这样前面的种种结果也解释的通了。
开始玩qt,使用代码修改设计模式生成的菜单的更多相关文章
- QT中静态库的生成与使用——创建共享库代码,附例子
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
- QT中静态库的生成与使用
一. 静态库的生成 1. 测试目录: lib 2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...
- QT中共享库的生成与使用
一. 静态库的生成1. 测试目录: lib2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm i ...
- 试试使用 eolinker 扫描 GitLab 代码注释自动生成 API 文档?
前言: 一般写完代码之后,还要将各类参数注解写入API文档,方便后续进行对接和测试,这个过程通常都很麻烦,如果有工具可以读取代码注释直接生成API文档的话,那会十分方便. 此前一直都是在使用eolin ...
- mybatis generator自动生成代码时 只生成了insert 而没有其他的
mybatis框架提供了非常好用的逆向工程插件,但是在使用过程中会有很多问题. 我在使用中就遇到了只生成insert和insertSeletive方法,而不生成其他根据primary key查询更新删 ...
- qt 拖拽 修改大小(二)
最近项目需要实现windows下橡皮筋的效果,所以对此做了一些了解,特此记录. 首先windows系统是支持橡皮筋效果的,需要使用win32方 法:SystemParametersInfo(SPI_S ...
- 在win7上跑基于任少卿作者代码修改的RPN+BF实验
1.前言 之前在win10上成功的跑起来faster-rcnn的实验,并且跑了一下CaltechPedestrian的数据集,但是效果一直不理想,折腾了好久也没弄清楚到底原因出在哪里,直到读了Is F ...
- 修改ScriptBundle 生成顺序
ScriptBundle 一般用法 C#的代码如下: bundles.Add(new ScriptBundle("~/bundles/jqueryval") .Include(&q ...
- 手动修改ARM Linux的静态IP和用QT获取和修改IP
.vi /etc/network/interfaces # 找到“# Wired or wireless interfaces” .注释掉 iface eth0 inet dhcp 这是自动获取ip地 ...
随机推荐
- [luoguP2760] 科技庄园(背包DP)
传送门 每次拿完还得回去... 数据中有两个需要注意的地方: 存在桃树上有桃子但是摘 0 次的情况 题目中要求体力不能为0,因此就算到达了重点体力也不能为0,所以实际上允许使用的体力为 a - 1 把 ...
- [bzoj3809]Gty的二逼妹子序列_莫队_分块
Gty的二逼妹子序列 bzoj-3809 题目大意:给定一个n个正整数的序列,m次询问.每次询问一个区间$l_i$到$r_i$中,权值在$a_i$到$b_i$之间的数有多少个. 注释:$1\le n\ ...
- mongodb片健的选取及更改
1.总的原则:选键的时候多考虑以下问题. 写操作是怎么样的,有多大? 系统每小时会写多少数据,每天呢,高峰期呢 那些字段是随机的,那些是增长的 读操作是怎么样的,用户在访问那些数据 数据索引做了吗?应 ...
- eclipse中报错:java.lang.OutOfMemoryError: Java heap space
问题: 在eclipse中执行java程序.去重100多万的数据,报例如以下错误: java.lang.OutOfMemoryError: Java heap space 异常原因: 在JVM中假设9 ...
- ORA-00904:"T1"."AREA_ID" :标识符无效
1.错误描写叙述 ORA-00904:"T1"."AREA_ID" :标识符无效 00904 . 00000 - "%s:invalid identi ...
- Combining an audio file with video file in python
Combining an audio file with video file in python - Stack Overflow https://stackoverflow.com/questio ...
- rel='canonical'
rel='canonical' <!DOCTYPE html><html><head> <meta charset="utf-8"/> ...
- C++之内部类(内部类就是外部类的友元类,单向友元。只是内部类比友元类多了一点权限)
1. 内部类的概念 如果一个类定义在另一个类的内部,这个内部类就叫做内部类.注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类.外部类对内部类没有任何优越的访问权限. ...
- [模板] manacher(教程)
还是不会马拉车啊.今天又学了一遍,在这里讲一下. 其实就是一个很妙的思路,就是设置一个辅助的数组len,记录每个点的最大对称长度,然后再存一个mx记录最大的对称子串的右端点.先开二倍数组,然后一点点扩 ...
- POJ3420 递推+矩阵快速幂
POJ3420 很有趣的覆盖问题 递归推导如下: f[n] = f[n-1] + 4*f[n-2] + 2 * [ f[n-3] + f[n-5] + f[n-7] +.... ] + 3 * [ ...