Я работаю в проекте, где мне нужно автоматически открывать (показывать или всплывать) элементы в 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()
, я получил список меню в menubar, я имею в виду, я получил "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, если элемент является меню), чтобы узнать, если item является QMenu, если да, можно повторить получение списка действий этого меню и продолжить итерацию. Но это не работает для меня, я ожидал, что для
QList<Object*> lst2 = QMenuBar::findChildren<QAction*>();
каждый элемент «Файл, Редактировать справку» QAction::menu()
возвращает действительный указатель меню, чтобы я мог получить список действий каждого меню, но у меня это совсем не работает.
Я очень ценю ваше время и вашу помощь, я надеюсь, что этот вопрос поможет большему количеству людей. Мне действительно тяжело с этим.
Заранее спасибо.