2012-01-17 20 views

答えて

2

変数pRightKeyMenuが漏れています。

一つの可能​​な解決策があるため、それを再利用することで、あなたのコードで、作成したQMenuは常に同じです:

Widget::Widget() 
{ 
    // ... 
    this->pRightKeyMenu = new QMenu(this); 
} 

// Slot 
void Widget::contextMenu() 
{ 
    QCursor cur=this->cursor(); 
    this->pRightKeyMenu->popup(cur.pos()); 
} 
+0

これは良い解決策に見えます、私はit.thankを試してみます –

1

試してください:あなたはそれを解放していないので、

QMenu pRightKeyMenu; 
pRightKeyMenu.exec(cur.pos()); 
+0

ときスコープのうちpRightKeyMenuが削除されます - あなたも(execを '@killaclickポップアップ – killdaclick

+0

は表示されません)、それが閉じられる前にメニューがスコープの外に行くことはありませんので、'ブロッキング操作です。 – kayahr

5

また、あなたが行うことができます:

QCursor cur=this->cursor(); 
QMenu* pRightKeyMenu=new QMenu(this); 
connect(pRightKeyMenu, SIGNAL(aboutToHide()), pRightKeyMenu, SLOT(deleteLater()));; 
pRightKeyMenu->popup(cur.pos()); 
+0

この方法は私のケースを約束しているようですが、それはときにはsegfaultsになることが判明します。少なくとも、Windowsネイティブのモーダルダイアログが実行されたときのような感じです。 – Predelnik

3

を任意の漏れを避けるために、 QMenuをQScopedPointerとしてクラスに追加し、クラスコンストラクターでメニューをインスタンス化します。

class Widget : public QWidget 
{ 
... 
private: 
    QScopedPointer<QMenu> _myMenu; 
} 

Widget::Widget() 
{ 
... 
    _myMenu.reset(new QMenu(this)); 
    _myMenu->addAction("Some menuitem..", this, SLOT(menuItemActivated())); 
} 
関連する問題