【问题标题】:findChild of QMenu does is not working properlyQMenu 的 findChild 不能正常工作
【发布时间】:2018-11-26 10:28:54
【问题描述】:

QMenu 的 findChild 无法正常工作。

以下是适合您的代码

QMenu* lMenu;
QMenu* existingMenu = lMenu->findChild<QMenu*>(QString("A..."));
if (!existingMenu)
  lMenu->addMenu("A...");

即使字符串 A 的菜单已经存在,我也会将现有菜单设为 NULL

【问题讨论】:

    标签: c++ qt qt5 qmenu


    【解决方案1】:

    findChild() 方法搜索 objectName 而不是标题,在您的情况下,子菜单没有名称,因此它返回一个空列表,所以您应该首先过滤 QMenus然后使用标题进行第二次过滤:

    #include <algorithm>
    
    ...
    
    QString text("A...");    
    // get sub-menus
    QList<QMenu *> sub_menus = lMenu->findChildren<QMenu *>();
    // filter by title
    if(std::find_if(sub_menus.begin(), sub_menus.end(),
                    [text] (QMenu *menu){ return menu->title() == text; }) == sub_menus.end())
    {
        lMenu->addMenu("A...");
    }
    

    【讨论】:

      【解决方案2】:

      如果要使用findChild,则必须将QMenu 视为QObject。因为这个函数是搜索QObject而不是QMenu

      演示:

      QMenu* menu = new QMenu;
      QMenu* subMenu = new QMenu("subMenu", menu); // second parameter indicate menu is the parent qobject of subMenu
      subMenu->setObjectName("subMenu object name"); // give submenu a qobject name for findChild 
      menu->addMenu(subMenu);
      
      if(menu->findChild<QMenu*>("subMenu object name") == subMenu) {
          qDebug()<<"Find subMenu";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-30
        • 2010-11-30
        • 2021-10-02
        • 2017-08-06
        • 2013-11-22
        • 1970-01-01
        • 2013-09-10
        • 2017-04-05
        相关资源
        最近更新 更多