大家好,
nbsp nbsp;我有一些代码根据一些数据生成一个动态填充的QMenu(我将称之为thisMenu)。创建了QMenu thisMenu,将一些"主"QWidget作为父菜单,并将其添加到该QWidget内的QMenuBar(menuBar.addMenu(&thisMenu))。稍后,我希望用户能够从上下文菜单访问thisMenu(用户右键单击QWidget的某个部分,弹出一个带有一些操作的QMenu(称为上下文菜单),并将上一个QMenu作为子菜单)。
nbsp nbsp;如果我重复使用我第一次使用contextMenu.addMenu(&thisMenu)创建的QMenu,我会发现,即使contextMenu弹出在正确的全局位置,thisMenu也总是被翻译到其他位置,有时出现在contextMenu的上方,有时在其下。
nbsp nbsp;我可以测试这是否链接到了育儿链:thisMenu不是contextMenu的子菜单,如果我将其创建为contextMenu的一个子菜单,一切都很好。是否有一种方法可以在不重新创建类似于thisMenu的QMenu或更改thisMenu的父菜单的情况下干净地处理这种情况;即在QMenuBar和某些上下文菜单/QMenu中重复使用此菜单?换句话说,处理QMenu的育儿链和共享QMenu是什么正确的方式?
nbsp nbsp;谢谢你,
换句话说,处理QMenu的育儿链和共享QMenu是什么正确的方式?
您不能在多个位置共享一个QMenu——每个QMenu一次只能存在于一个位置。您应该创建单独的QMenus:一个用于菜单栏,一个用于上下文菜单。
一个简单的方法是将菜单生成代码放在for循环中,创建多个相同的菜单。
请问您为什么要重用QMenu?
我可以测试一下这是否与育儿链有关:thisMenu不是contextMenu 的子项
是的,文档中对此进行了描述。将一个QMenu添加到另一个时,父菜单不会更改:http://qt-project.org/doc/qt-5/QMenu.html#addMenu
如果我将其创建为contextMenu的子项,那么一切都很好。
小部件的位置始终绘制在相对于其父对象的位置。(记住:QMenu是QWidget)
void duplicateMenu(QMenu* dst, QMenu& origin)
{
QMenu* sub = dst->addMenu(origin.title());
QList<QAction*> actions=origin.actions();
for(QList<QAction*>::iterator it=actions.begin(); it!=actions.end(); it++)
{
QMenu* itMenu = (*it)->menu();
if(itMenu!=NULL)
duplicateMenu(sub, *itMenu);
else
sub->addAction(*it);
}
}