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

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

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

在几次尝试未果之后看了看 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. code wars quiz: toInteger

    Your task is to program a function which converts any input to an integer. Do not perform rounding, ...

  2. MVC之查询demo

    上篇已经说过怎样建立MVC项目.这次主要讲述样例的实现. 其基本的功能就是从数据库中查询一些基本信息. 前边我们已经将实体引入到了项目中,这时Model目录中已经出现了我们建立的newsSystem. ...

  3. [Algorithm] Determine if two strings are an anagram

    The anagram test is commonly used to demonstrate how an naive implementation can perform significant ...

  4. 【Android 开发实例】时间管理APP开发之数据库设计

    当然也能够先写界面什么的.可是,总认为先把数据库后台写好在写界面比較放心. 对于数据库的设计,我一開始没什么概念.甚至不知道怎样下手,一開始想着设计成几个表?有哪些字段? 最后用了两天时间,还是一无所 ...

  5. C++与C的那些差异

    虽说C++是向后兼容C的,但C++与C还是存在许多差异.这里举了几个例子,也是我们很容易忽略的地方.如果你还知道其他的更多的Differences,或者发现什么错误,可以评论告诉我,大家一起学习进步. ...

  6. Meter Bus解析4:升压斩波电路

             Meter Bus解析1(http://blog.csdn.net/qingwufeiyang12346/article/details/47767595),对Meter Bus进行 ...

  7. java学习笔记:文件名区分大小写

    我按照网上的教程,写了JAVA第一个程序:Hello World!,出了两个问题,都栽在 大小写 上. public class Hello { public static void main(Str ...

  8. [译]使用AssetBundle Manader

    AssetBundle and the AssetBundle Manager 介绍 AssetBundle允许从本地或者远程服务器加载Assets资源,利用AssetBundles技术,Assets ...

  9. mac关闭和开启启动声

    1 关闭 sudo nvram SystemAudioVolume=%01 2 开启 sudo nvram -d SystemAudioVolume

  10. 在C#中实现listbox的项上下移动(winform) 标准

      在C#中实现listbox的项上下移动(winform) 收藏人:梅毛子360   2013-10-02 | 阅:1  转:2  |  分享    |    来源              usi ...