【发布时间】:2018-11-26 10:28:54
【问题描述】:
QMenu 的 findChild 无法正常工作。
以下是适合您的代码
QMenu* lMenu;
QMenu* existingMenu = lMenu->findChild<QMenu*>(QString("A..."));
if (!existingMenu)
lMenu->addMenu("A...");
即使字符串 A 的菜单已经存在,我也会将现有菜单设为 NULL
【问题讨论】:
QMenu 的 findChild 无法正常工作。
以下是适合您的代码
QMenu* lMenu;
QMenu* existingMenu = lMenu->findChild<QMenu*>(QString("A..."));
if (!existingMenu)
lMenu->addMenu("A...");
即使字符串 A 的菜单已经存在,我也会将现有菜单设为 NULL
【问题讨论】:
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...");
}
【讨论】:
如果要使用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";
}
【讨论】: