Корректный способ удаления QMenu

Есть виджет, который создает контекстное меню, примерно таким образом:

void Widget::onContextMenuRequested(const QPoint position)
{
    auto menu = new QMenu(this);

    menu->addAction(...);
    menu->addAction(...);
    menu->addAction(...);

    menu->popup(m_view->horizontalHeader()->viewport()->mapToGlobal(position));
}

Вопрос следующий: как корректно удалить это меню? Ему назначен parent (this), но тогда получается, что пока текущее окно не удалится, все экземпляры меню будут висеть в оперативной памяти. Создавать меню на стеке и показывать его при помощи exec не вариант, так как это блокирует поток выполнения.

Нашел для себя такой вариант решения

connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater);

Однако такой вариант кажется мне некрасивым. Есть ли какие то рекомендации по очищению памяти от неиспользуемых menu? Возможно фреймворк делает это самостоятельно?


Ответы (1 шт):

Автор решения: Swift - Friday Pie

В большинстве случаев создание и удаление меню - более трудоемкая вещь, чем его содержание. QAction, которые при этом остаются "живыми", более затратны. Исключением являются случаи когда набор элементов чрезвычайно динамичен (не проще иметь несколько меню или изменять существующее?) или количество экземпляров родителя огромно.

connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater);

Этот паттерн вполне корректен. Удалять привязанный событиями объект когда попало нельзя. Тут он удаляется при первой возможности после закрытия.

→ Ссылка