之前制作菜单时,不是纯代码便是用设计模式 直接图形化完成。

今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成;

但通过设计模式完成的没有暴露指针给我,至少我没发现。

在几次尝试未果之后看了看 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个菜单项,如上代码依次遍历修改 三个菜单项都被成功修改.
我这里对QMenuBar类对象调用actions()函数,返回的应该是Qlist<QAction*> 才是,而这里我可以成功访问到QMenu 对象。
讲道理这个应该是非法的,因为类型不对。除非有从QMenu到QAction的转换构造。所以我查了下api 发现有一个函数: 
QAction *  addMenu(QMenu *menu)

是不是因为这个函数才使得actions()成功调用? 
同时,QMenu 还有一个成员函数 
QAction *QMenu::menuAction() const
说是返回与菜单相关联的操作
所以有这样的尝试
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,使用代码修改设计模式生成的菜单的更多相关文章

  1. QT中静态库的生成与使用——创建共享库代码,附例子

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  2. QT中静态库的生成与使用

    一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为&qu ...

  3. QT中共享库的生成与使用

    一. 静态库的生成1. 测试目录: lib2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm i ...

  4. 试试使用 eolinker 扫描 GitLab 代码注释自动生成 API 文档?

    前言: 一般写完代码之后,还要将各类参数注解写入API文档,方便后续进行对接和测试,这个过程通常都很麻烦,如果有工具可以读取代码注释直接生成API文档的话,那会十分方便. 此前一直都是在使用eolin ...

  5. mybatis generator自动生成代码时 只生成了insert 而没有其他的

    mybatis框架提供了非常好用的逆向工程插件,但是在使用过程中会有很多问题. 我在使用中就遇到了只生成insert和insertSeletive方法,而不生成其他根据primary key查询更新删 ...

  6. qt 拖拽 修改大小(二)

    最近项目需要实现windows下橡皮筋的效果,所以对此做了一些了解,特此记录. 首先windows系统是支持橡皮筋效果的,需要使用win32方 法:SystemParametersInfo(SPI_S ...

  7. 在win7上跑基于任少卿作者代码修改的RPN+BF实验

    1.前言 之前在win10上成功的跑起来faster-rcnn的实验,并且跑了一下CaltechPedestrian的数据集,但是效果一直不理想,折腾了好久也没弄清楚到底原因出在哪里,直到读了Is F ...

  8. 修改ScriptBundle 生成顺序

    ScriptBundle 一般用法 C#的代码如下: bundles.Add(new ScriptBundle("~/bundles/jqueryval") .Include(&q ...

  9. 手动修改ARM Linux的静态IP和用QT获取和修改IP

    .vi /etc/network/interfaces # 找到“# Wired or wireless interfaces” .注释掉 iface eth0 inet dhcp 这是自动获取ip地 ...

随机推荐

  1. HDU 1254 条件过程复杂的寻找最短路

    这里一看就是找箱子到终点的最短路 一开始还傻傻的以为人的位置给的很没有意思- -,然后果然错了 没过多久想明白了错误,因为你推箱子并不是你想去哪里推就能去哪推的,首先得考虑人能否过的去,因为可能人被箱 ...

  2. sql语句的字段转成Date

    ms_sql:convert(datetime,'2010-11-13')cast('2017-01-01' as datetime) Oracle:to_date('2017-01-01') mys ...

  3. 常州模拟赛d5t3 appoint

    分析:这道题比较奇葩.因为字符串没有swap函数,所以一个一个字符串交换只有30分.但是我们可以不用直接交换字符串,而是交换字符串的指针,相当于当前位置是哪一个字符串,每次交换int,可以拿60分. ...

  4. I - Navigation Nightmare 并查集

    Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1 ...

  5. 1043 方格取数 2000 noip 提高组

    1043 方格取数  2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...

  6. Display certain line(s) from a text file in Linux.

    Purpose: Display certain line or lines from a text file, such as : Display the 1000th line from file ...

  7. HDU 1853 Cyclic Tour(最小费用最大流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others) Tota ...

  8. 一致性哈希server的数据维护

    本文是实例说明一致性哈希server的数据维护用途. 理论说明參考:http://blog.csdn.net/chenjiayi_yun/article/details/41624603 例如以下图所 ...

  9. Android面试题1

    1.Android中intent的是? 答:实现界面间的切换,能够包括动作和动作数据.连接四大组件的纽带. 2.SAX解析xml文件的长处的是? 答:不用事先调入整个文档,占用资源少 3.在andro ...

  10. CentOS-6.4-DVD系统中安装Oracle-11.2.0.4

    完整版见https://jadyer.github.io/2014/05/18/centos-install-oracle/ /** * CentOS-6.4-DVD系统中安装Oracle-11.2. ...