findChild из QMenu не работает должным образом - PullRequest
0 голосов
/ 02 октября 2018

findChild из QMenu не работает должным образом.

Ниже приведен код для вас

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

Я получаю существующее меню как NULL, даже если меню для строки A уже присутствует

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Если вы хотите использовать 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";
}
0 голосов
/ 02 октября 2018

Метод findChild() ищет имя объекта, а не заголовок, в вашем случае подменю не имеют имени, поэтому он возвращает пустой список, поэтому вам следует сначала отфильтровать QMenuа затем выполните второй фильтр с заголовками:

#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...");
}
...