Корректный способ удаления 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 шт):
В большинстве случаев создание и удаление меню - более трудоемкая вещь, чем его содержание. QAction
, которые при этом остаются "живыми", более затратны. Исключением являются случаи когда набор элементов чрезвычайно динамичен (не проще иметь несколько меню или изменять существующее?) или количество экземпляров родителя огромно.
connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater);
Этот паттерн вполне корректен. Удалять привязанный событиями объект когда попало нельзя. Тут он удаляется при первой возможности после закрытия.