C++ QMenu的findChild无法正常工作

C++ QMenu的findChild无法正常工作,c++,qt,qt5,qmenu,C++,Qt,Qt5,Qmenu,QMenu的findChild工作不正常 下面是您的代码 QMenu* lMenu; QMenu* existingMenu = lMenu->findChild<QMenu*>(QString("A...")); if (!existingMenu) lMenu->addMenu("A..."); QMenu*lMenu; QMenu*existingMenu=lMenu->findChild(QString(“A…””); 如果(!existingMenu) l

QMenu的findChild工作不正常

下面是您的代码

QMenu* lMenu;
QMenu* existingMenu = lMenu->findChild<QMenu*>(QString("A..."));
if (!existingMenu)
  lMenu->addMenu("A...");
QMenu*lMenu;
QMenu*existingMenu=lMenu->findChild(QString(“A…””);
如果(!existingMenu)
l菜单->添加菜单(“A…”);
即使字符串A的菜单已经存在,我也会将现有菜单设置为空

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

#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...");
}
#包括
...
Q字符串文本(“A…”);
//获取子菜单
QList sub_menu=lMenu->findChildren();
//按标题筛选
if(std::find_if(sub_menus.begin(),sub_menus.end(),
[text](QMenu*菜单){return menu->title()==text;}==sub_menu.end())
{
l菜单->添加菜单(“A…”);
}
方法
findChild()
搜索objectName而不是标题,在您的情况下,子菜单没有名称,因此返回空列表,因此您应该首先过滤
QMenu
s,然后对标题进行第二次过滤:

#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...");
}
#包括
...
Q字符串文本(“A…”);
//获取子菜单
QList sub_menu=lMenu->findChildren();
//按标题筛选
if(std::find_if(sub_menus.begin(),sub_menus.end(),
[text](QMenu*菜单){return menu->title()==text;}==sub_menu.end())
{
l菜单->添加菜单(“A…”);
}
< /代码> 如果您想使用,必须考虑<代码> QMenu <代码>作为<代码> QObjult<代码>。因为该函数用于搜索
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";
}
QMenu*菜单=新建QMenu;
QMenu*子菜单=新建QMenu(“子菜单”,菜单);//第二个参数指示菜单是子菜单的父qobject
子菜单->设置对象名(“子菜单对象名”);//为findChild提供子菜单的qobject名称
菜单->添加菜单(子菜单);
如果(菜单->findChild(“子菜单对象名称”)==子菜单){
如果您想使用,必须考虑<代码> QMenu <代码>作为<代码> QObjult<代码>。因为该函数用于搜索<代码> QObjs<代码>,而不是<代码> QMenu < /代码> ./P>
演示:

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";
}
QMenu*菜单=新建QMenu;
QMenu*subMenu=newqmenu(“subMenu”,menu);//第二个参数指示menu是子菜单的父qobject
子菜单->设置对象名称(“子菜单对象名称”);//为子菜单指定findChild的qobject名称
菜单->添加菜单(子菜单);
如果(菜单->findChild(“子菜单对象名称”)==子菜单){
qDebug()