Im работает в проекте, где мне нужно автоматически открывать (показывать или всплывать) элементы в QMenuBar.
Скажем, у меня есть следующая строка меню:
File Edit Help
-op1 -op1 -op1
-op2 -op2 -op2
Чтобы установить действие (показать меню, связанное с этим действием), я использую:
menuBar->setActiveAction(mymenuactionpointer);
Как я знаю, я могу использовать одно из следующих, чтобы получить список указателей на элементы QMenuBar:
QMenuBar::actions();
или
QList<Object*> lst1 = QMenuBar::findChildren<QObject*>();
QList<Object*> lst2 = QMenuBar::findChildren<QAction*>();
Когда я использую QMenuBar::findChildren<QAction*>()
или MenuBar::actions()
, я получил список меню в строке меню, я имею в виду, что я получил "File, Edit, Help"
из моего QMenuBar, размер QList в этом случае равен 3.
Когда я использую QMenuBar::findChildren<QObject*>()
, я получил список QObject размером 6, который является правильным количеством элементов в строке меню. Тем не менее, я попытался применить QAction *
QAction *a = (QAction *)lst1.at(0);
QAction *a = qobject_cast<QAction*>(lst1.at(0));
QAction *a = dynamic_cast<QAction*>(lst1.at(0));
Во всех этих случаях a
не является NULL, но когда я пытаюсь получить имя действия QAction::title()
, он всегда вызывает у меня ошибку сегментации.
Я искал и нашел здесь, что после получения списка меню меню можно запросить QAction::menu()
(который возвращает действительный указатель QMenu, если элемент это меню), чтобы узнать, является ли элемент QMenu, если да, можно повторить получение списка действий этого меню и продолжить итерацию. Но это не работает для меня, я ожидал, что для
QList<Object*> lst2 = QMenuBar::findChildren<QAction*>();
каждый элемент "Файл, редактирование справки" QAction::menu()
возвращает допустимый указатель меню, поэтому я могу получить список действий каждого меню, но для меня это вообще не работает.
Я очень ценю ваше время и вашу помощь, надеюсь, этот вопрос поможет большему количеству людей. Мне действительно трудно с этим справиться.
Спасибо заранее.