LINUX.ORG.RU

QMenuBar из QMenu *

 


0

2

Есть динамическая библиотека, одна из функций которой возвращает указатель на QMenu. Нужно сделать QMenuBar из этого QMenu так, чтобы в нём находились пункты первого уровня QMenu, а из них уже выпадали подменю, соответствующие нужным пунктам. Сейчас делаю так:

foreach (QAction *action, menu->actions()) {
    QMenu *submenu = action->menu();
    if (submenu) {
        menuBar->addMenu(submenu);
    } else {
        menuBar->addAction(action);
    }
}

Этот код создаёт нужный мне QMenuBar. Проблема в том, что QMenu, из которого он создан, может изменяться через время, и эти изменения никак не отражаются в QMenuBar (логично, если он один раз создан и всё). Нужно же сделать так, чтобы при любых изменениях первого уровня объекта QMenu соответствующим образом менялся и QMenuBar. Проблема в том, что у QMenu нет сигналов, которые emit при изменениях. Задача усложняется тем, что объект QMenu создаётся в отдельной библиотеке и изменять её крайне нежелательно, поэтому унаследовать QMenu и override в нём методы типа addAction, чтобы они вызывали сигналы, — это крайняя мера. Есть ли другие способы отслеживания изменений QMenu?

Ответ на: комментарий от Kalashnikov

installEventFilter() и фильтровать QEvent::ActionAdded (Changed/Removed)?

Спасибо, кажется, работает.

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от Kalashnikov

Я хотел сказать, что я искал что-то подходящее (и нашел QChildEvent, который тоже мог бы помочь), и вернувшись сюда увидел твой пост, который подходит лучше, наверное (из доков неясно срабатывает ли он при addMenu).

anonymous
()
Ответ на: комментарий от anonymous

Хотя ему не нужно при addMenu, так что все окей.

Да, библиотека при изменении меню сначала делает clear(), а потом добавляет пункты с помощью addAction().

gentoo_root ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.