我正在进行一个项目,需要自动打开(显示或弹出)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()
时,我得到了菜单栏中菜单的列表,我的意思是,我从我的QMenuBar中得到了"File, Edit, Help"
,在这种情况下,QList的大小为3。当我使用
QMenuBar::findChildren<QObject*>()
时,我得到了一个大小为6的QObject列表,这是菜单栏中正确的项目数。然而,我已经尝试将其转换为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()
时,总是导致分段错误。我一直在搜索,我发现 here 在获取菜单栏操作列表后,可以要求
QAction::menu()
(如果该项是菜单,则返回有效的 QMenu 指针)以知道该项是否为 QMenu,如果是,则可以重复获取该菜单的操作列表,并继续迭代。但这对我不起作用,我期望的是QList<Object*> lst2 = QMenuBar::findChildren<QAction*>();
每个元素"文件、编辑、帮助"QAction::menu()
都返回一个有效的菜单指针,所以我可以获取每个菜单的操作列表,但这对我来说根本不起作用。
QList<QMenu*> list = menuBar()->findChildren<QMenu*>();
返回一个有效的QMenu*
列表,您可以使用递归函数迭代它们,并且您可以获取它们的->actions()
。您遇到了什么问题? - Hossein