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

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

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

在几次尝试未果之后看了看 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 容器才是啊

这里我试验过,

auto it= menuBar()->actions().begin();

(*it)->setText(tr("测试Action"));

it++;

(*it)->setText(tr("测试Action01"));

it++;

(*it)->setText(tr("测试Action02"));

通过设计模式 构建了3个菜单项,如上代码依次遍历修改 三个菜单项都被成功修改.

我这里对QMenuBar类对象调用actions()函数,返回的应该是Qlist 才是,而这里我可以成功访问到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添加菜单纯代码_开始玩qt,使用代码修改设计模式生成的菜单相关推荐

  1. qt添加菜单纯代码_QtCreator插件开发(二)——QtCreator菜单和菜单项

    QtCreator插件开发(二)--QtCreator菜单和菜单项 一.QtCreator菜单栏简介 1.QtCreator菜单简介 QtCreator菜单栏如下: QtCreator默认菜单包括&q ...

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

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

  3. 50行python游戏代码_使用50行Python代码从零开始实现一个AI平衡小游戏

    使用50行Python代码从零开始实现一个AI平衡小游戏 发布时间:2020-10-23 09:26:14 来源:脚本之家 阅读:74 集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何 ...

  4. vscode中怎样格式化js代码_如何在Visual Studio代码(VSCode)中格式化代码

    回答(30) 2 years ago 对于那些想要自定义要格式化的JavaScript文件的人,可以使用 JSfiles 属性上的任何扩展名同样适用于HTML . { "beautify.o ...

  5. javascript 代码_如何使您JavaScript代码保持简单并提高其可读性

    javascript 代码 by Leonardo Lima 莱昂纳多·利马(Leonardo Lima) 如何使您JavaScript代码保持简单并提高其可读性 (How to keep your ...

  6. 史上最烂代码_历史上最大的代码库

    史上最烂代码 Here's a diagram of the biggest codebases in history, as measured by lines of code: 这是历史上最大的代 ...

  7. python测验5 函数和代码_测验5: 函数和代码复用 (第5周)-单选题

    1.以下选项不是函数作用的是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬ A. 提 ...

  8. idea看更改过的代码_就是你把所有代码全写在一个类里的?

    来源 | https://urlify.cn/6jQRN3 最近,在对已有项目进行扩展的时候,发现要改动的一个类它长900行,开放了近40个public接口,我流着泪把它给改完了. 为了防止这样的惨剧 ...

  9. java测试性能代码_关于性能:Java代码内部的基准测试

    我最近一直在研究基准测试,我一直对记录程序数据等感兴趣.我想知道我们是否可以在程序中有效地实现自己的内存使用代码和实现自己的时间消耗代码.我知道如何检查代码运行所需的时间: public static ...

最新文章

  1. 【机器视觉案例】(13) 脸部和摄像机间的距离测量,自适应文本大小,附python完整代码
  2. Elasticsearch之Mapping Meta-Fields
  3. 文件的使用python_python-文件的使用
  4. AJAX框架眼镜店美瞳,PS完成对照片中人物的美瞳效果
  5. c++用new求数组中n个数的和_在C++中实现任意大小数组的定义方法
  6. 【MySQL】replace into 浅析之二
  7. Jquery 提交 乱码的问题
  8. UVA1276 Network
  9. learning - Haskell AND Lisp vs. Haskell OR Lisp - Programmers Stack Exchange
  10. [010]Try块和异常处理
  11. 20135226黄坤信息安全系统设计基础期末总结
  12. 易语言计算机代码,易语言基础教程之简单代码的编写
  13. Android List的混排 随机排序
  14. 2021年电工(初级)考试试卷及电工(初级)考试平台
  15. 4. Zigbee应用程序框架开发指南 - 生成应用程序配置文件
  16. 北上杭是梦!“郑福贵”才是中国智慧城市的真相
  17. Docker自学笔记 (二)
  18. RDKit | 计算拓扑极性表面积TPSA
  19. TeamTalk源码分析(二) —— 服务器端的程序的编译与部署
  20. Excel删除重复数据java_合并Excel范围中的数据,删除空白和重复项

热门文章

  1. 【BZOJ3884】上帝与集合的正确用法
  2. [译]看漫画学Flux
  3. OpenCL+minGW64+windows8.1 enviroment
  4. SQL 内置排名函数 DENSE_RANK
  5. SQL Server 索引结构及其使用
  6. .net操作xml小结 (转)
  7. 使用TortoiseSVN下载SourceForge.net上的代码
  8. 数据分析应用统计学之分散性与变异性的测量【极差、四分位差、偏态系数、峰态系数、统计指标】
  9. Python稳基修炼之计算机等级考试易错概念题6(含答案)
  10. 初者Python笔记(案例:用字典无限添加节点)