• 开始玩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个菜单项,如上代码依次遍历修改 三个菜单项都被成功修改.
    我这里对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()的子菜单,所有其他项都被认为是操作项。
    这样前面的种种结果也解释的通了。




  • 相关阅读:
    Large-Scale Oil Palm Tree Detection from High-Resolution Satellite Images Using Two-Stage Convolutional Neural Networks(worldview油棕树检测)
    Visual Detail Augmented Mapping for Small Aerial Target Detection(航片动态小目标检测)
    Large Kernel Matters —— Improve Semantic Segmentation by Global Convolutional Network(GCN全局卷积网络)
    Learning a Discriminative Feature Network for Semantic Segmentation(语义分割DFN,区别特征网络)
    Semantic Segmentation on Remotely Sensed Images Using an Enhanced Global Convolutional Network with Channel Attention and Domain Specific Transfer Learning
    Super-Resolution Restoration of MISR Images Using the UCL MAGiGAN System 超分辨率恢复
    python 中内存释放与函数传递numpy数组问题
    hdfs的shell命令
    副本策略
    数据分割
  • 原文地址:https://www.cnblogs.com/yuedongdeguangzi/p/7591826.html
Copyright © 2020-2023  润新知