Всем привет,
У меня есть некоторый код, генерирующий динамически заполненное QMenu в зависимости от некоторых данных (я назову это thisMenu). QMenu thisMenu создается, принимая некоторый «основной» QWidget в качестве родительского и добавляется в QMenuBar в этом QWidget (menuBar.addMenu (thisMenu). Позже я хочу, чтобы пользователь мог получить доступ к thisMenu из контекстного меню ( пользователь щелкает правой кнопкой мыши по некоторой части QWidget, которая вызывает QMenu (называемый contextMenu) с некоторыми действиями, а предыдущий QMenu — как подменю).
Если я снова использую QMenu, который я сначала создал с contextMenu.addMenu (thisMenu), я обнаруживаю, что даже если contextMenu появляется в правильной глобальной позиции, thisMenu всегда переводится в какую-то другую позицию и появляется иногда выше, иногда в contextMenu.
Я могу проверить, что это связано с цепочкой родителей: thisMenu не является дочерним для contextMenu, если я создаю его как дочерний для contextMenu, все в порядке. Есть ли способ чистой обработки этого случая без воссоздания QMenu, подобного thisMenu, или изменения родителя thisMenu; повторное использование thisMenu как в QMenuBar, так и в некотором контекстном меню / QMenu? Другими словами, как правильно обращаться с родительской цепочкой для QMenu и делиться QMenu?
Спасибо,
Другими словами, как правильно обращаться с родительской цепочкой для QMenu и делиться QMenu?
Вы не можете совместно использовать QMenu в нескольких местах — каждое QMenu может существовать только в одном месте одновременно. Вы должны создать отдельный QMenus: один для вашей строки меню и один для вашего контекстного меню.
Простой способ — поместить код, генерирующий меню, в цикл for, чтобы создать несколько идентичных меню.
Могу я спросить, почему вы хотите повторно использовать QMenu?
Я могу проверить, что это связано с цепочкой родителей: thisMenu не является потомком contextMenu
Да, это описано в документации. Когда вы добавляете одно QMenu к другому, родительский элемент не изменяется: http://qt-project.org/doc/qt-5/QMenu.html#addMenu
если я создаю это потомком contextMenu, все в порядке.
Позиция виджета всегда отображается в позиции относительно его родителя. (Помните: QMenu — это QWidget)
Следующий JKSHВ ответ я решил использовать функцию для дублирования QMenu, не дублируя QAction в нем (они не наследуют 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);
}
}