Используя Qt5, скажем, у меня есть элемент управления, реализующий его собственное контекстное меню. И предположим, что при некоторых условиях я хочу добавить некоторые элементы в стандартное контекстное меню. Итак, чтобы сделать это, я создаю временный QMenu, добавлю некоторые вещи к нему и добавлю стандартное меню. Что-то вроде:Qt & Prepending один QMenu другому QMenu
// MyControl is derived from QPlainTextEdit
void MyControl::showContextMenu(const QPoint& pos)
{
// This is QPlainTextEdit::createStandardContextMenu()
QMenu* contextMenu = createStandardContextMenu();
if (someCondition)
{
QMenu* tempMenu = new QMenu(this);
/* add several actions to tempMenu */
tempMenu->addSeperator();
for (auto a : contextMenu->actions)
{
tempMenu->addAction(a);
}
// Feel like I should delete the original QMenu here but doing this
// will delete the QActions it created
// delete contextMenu;
contextMenu = tempMenu;
}
contextMenu->exec(mapToGlobal(pos));
delete contextMenu;
}
Вопрос в том, не является ли это источником утечки памяти? И если да, то каков правильный способ этого? Я не могу delete contextMenu
, прежде чем я сделаю contextMenu = newMenu;
, потому что это, очевидно, удаляет действия, которые я хочу.
EDIT:
В конце концов, что я хочу сделать, это использовать createStandardContextMenu()
который возвращает выделенную QMenu, а затем добавить некоторые QActions к верхней меню, и убедитесь, что утечки ничего.
Кажется, что newMenu и tempMenu одинаковы? Но тогда код неверен. Да, tempMenu утечки там, если не исправлены. Теперь похоже, что contextMenu также протекает. Не знаю, зачем вы это делаете. – AlexanderVX
Да, они были одинаковыми. Извините, я исправил это. – Addy
@Addy, чтобы избежать утечки памяти, вы можете использовать ['QSharedPointer'] (https://doc.qt.io/qt-5/qsharedpointer.html#operator-eq) вместо обычного указателя –