Как перебирать действия меню в Qt?

Я работаю в проекте, где мне нужно автоматически открывать (показывать или всплывать) элементы в QMenuBar.

Допустим, у меня есть следующая строка меню:

 File     Edit      Help
   -op1     -op1      -op1
   -op2     -op2      -op2

Чтобы установить действие (показать меню, связанное с этим действием), я использую:

menuBar->setActiveAction(mymenuactionpointer);

Насколько мне известно, я могу использовать одно из следующих действий, чтобы получить список указатели на элементы QMenuBar:

QMenuBar::actions();

или

QList lst1 = QMenuBar::findChildren();

QList lst2 = QMenuBar::findChildren();

Когда я использую QMenuBar :: findChildren () или MenuBar :: actions () , я получаю список меню в строке меню, я имею в виду, что я получил «Файл, Правка, Справка» из моего QMenuBar, размер QList в данном случае равен 3.

Когда я использую QMenuBar: : findChildren () Я получил список QObject размером 6, который является правильным количеством элементов в строке меню. Однако я попытался применить приведение к QAction *

QAction *a = (QAction *)lst1.at(0);
QAction *a = qobject_cast(lst1.at(0));
QAction *a = dynamic_cast(lst1.at(0));

. Во всех этих случаях a не равно NULL, но когда я пытаюсь получить имя действия QAction :: title () , оно всегда вызывает у меня ошибку сегментации.

Я искал и обнаружил здесь , что после получения списка действий в строке меню можно запросить QAction :: menu () (который возвращает действительный указатель QMenu, если элемент является меню), чтобы узнать, является ли элемент QMenu, если да, можно повторить получение списка действий этого меню и продолжить итерацию.Но у меня это не работает, я ожидал, что для

QList lst2 = QMenuBar::findChildren();

каждый элемент «File, Edit Help» QAction :: menu () возвращает действительный указатель меню, так что я мог бы получить список действий каждого меню, но у меня это совсем не работает.

Я очень ценю ваше время и вашу помощь. Надеюсь, этот вопрос поможет большему количеству людей. Мне действительно тяжело с этим.

Заранее спасибо.

17
задан sashoalm 18 July 2016 в 06:36
поделиться