开始玩qt,使用代码修改设计模式生成的菜单
2017-09-25 16:13
531 查看
之前制作菜单时,不是纯代码便是用设计模式 直接图形化完成。
今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成;
但通过设计模式完成的没有暴露指针给我,至少我没发现。
在几次尝试未果之后看了看 qmenubar qmenu qaction的继承关系,发现事情并没那么简单。
无论是从菜单选项还是从设计模式 的对象面板上看
无一不是 qmenubar->qmenu->qaction
其实并不是, qmenubar 和qmenu都是继承于qwidget
而qaction是直接继承于qobject,qwidget 也继承了qobject
所以 qmenubar 和qmenu 都可以使用actions()函数 来获得 action的集合。
因此:
代码应该是这样
一切都很成功!
那么问题来了:
qmenubar 和qmenu 都是qwidget的派生类 都可以使用actions方法。
但我们都知道 action是挂在qmenu下面的
但这里qmenubar调用actions() 是个什么鬼呢?
讲道理返回的是一个qlist<qaction*> 容器才是啊
这里我试验过,
我这里对QMenuBar类对象调用actions()函数,返回的应该是Qlist<QAction*> 才是,而这里我可以成功访问到QMenu 对象。
讲道理这个应该是非法的,因为类型不对。除非有从QMenu到QAction的转换构造。所以我查了下api 发现有一个函数:
QAction * addMenu(QMenu *menu)
是不是因为这个函数才使得actions()成功调用?
同时,QMenu 还有一个成员函数
QAction *QMenu::menuAction() const
说是返回与菜单相关联的操作
所以有这样的尝试
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.
今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成;
但通过设计模式完成的没有暴露指针给我,至少我没发现。
在几次尝试未果之后看了看 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()的子菜单,所有其他项都被认为是操作项。 这样前面的种种结果也解释的通了。
相关文章推荐
- [设计模式]在CodeDom代码生成中使用Decorator模式实现类型创建
- 使用Qt和Interpreter设计模式开发计算器(附源码)
- 使用designer-qt3设计界面,生成对应.h和.cpp文件时遇到的问题
- php中使用接口实现工厂设计模式的代码
- MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
- 设计模式(1)-使用简单工厂优化代码(转载)
- 设计模式(1)-使用简单工厂优化代码
- freemarker生成的前端代码下使用javascript实现导航菜单高亮显示
- 从今天开始学习iOS开发(iOS 7版)--实现一款App之使用设计模式
- [翻译]使用设计模式简化.NET中菜单和Form元素之间的关系
- libevent for qt网络模块,直接替换qt的select模型,支持epoll,select,pool.使用非常简单,无需修改以前的代码结构
- Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具
- 如何将多种设计模式结合使用(有原代码)
- 30. 代码实例-设计模式-回调方式使用模板方法
- MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
- 在windows下修改右键菜单以实现使用vs2010快速编译代码
- 使用VS正则表达式查找替换,批量修改Reflactor生成的代码问题
- (转载)如何将多种设计模式结合使用(有原代码)
- 黄聪:C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名
- 使用自动生成java文件和自动编译的动态代理模式-马士兵设计模式教程