私はカスタムコンテキストメニューを表の上に表示することができます。これは、メニューには、ターゲットウィジェットを受け入れ、座標汎用関数を使用して、生成される方法です。QMenuのコンテキストメニューをいつ、どのように正しく破棄するのですか?
#include <QMenu>
void MainWindow::makeContextMenu(const QPoint& pos, QWidget* target)
{
QMenu *menu = new QMenu(this);
menu->addAction(new QAction("Action 1", menu));
menu->addAction(new QAction("Action 2", menu));
menu->addAction(new QAction("Action 3", menu));
// Notify window about clicking
QObject::connect(menu, &QMenu::triggered, this, &MainWindow::menuClicked);
// If this is a scroll area, map coordinates to real app coordinates
if(QAbstractScrollArea* area = dynamic_cast<QAbstractScrollArea*>(target))
menu->popup(area->viewport()->mapToGlobal(pos));
else
menu->popup(pos);
}
問題はQMenu* menu
が破壊されず、メモリから削除されるんということです。それは隠された後でさえ、MainWindow
の子供として存続します。
どうすればよいですか?自分自身を削除するメニューを設定できますか?または、私はメニューの同じインスタンスを再利用するか、多分同じポインタに保存する必要がありますか?
あなたの提案が問題を解決しないことがわかりました。これは、ユーザーがメニュー内の特定の項目をクリックする必要がないためです。 –
@TomášZato、そう、あなたは '&QMenu :: triggered'が必ずしも発生していないと言っていますか? ....その場合、2番目と3番目のオプションはどうですか? – WhiZTiM
私はいくつかの変数のメニューを最後の手段としてのみ使うことを考えました。特に、そのメニューだけが常に1回だけ表示されます。しかし、QMessageBoxのように、消滅したときにそれ自体を削除した方が良いでしょう。 –