2

以下に私のコードを引用しました。問題は簡単に説明できます。selectedItem->text は、メニューで選択されたアクションを区別する正しい方法ではありません。それを正しく行う方法は?

void RView::ShowContextMenu(const QPoint& pos) // this is a slot
{
// for most widgets
QPoint globalPos = statusWidget->mapToGlobal(pos);
// for QAbstractScrollArea and derived classes you would use:
// QPoint globalPos = myWidget->viewport()->mapToGlobal(pos);

QMenu myMenu;
myMenu.addAction("first");
myMenu.addAction("second");

QAction* selectedItem = myMenu.exec(globalPos);
if (selectedItem)
{ 
    if(selectedItem->text == "first")
     // do something 
    if(selectedItem->text == "second")
     // do other stuff
}
else
{
    // nothing was chosen
}
}
4

1 に答える 1

2

QActions を直接比較し、 s で行うように の比較を使用するか、各アクションを目的のスロット (または、このコンテキストにローカライズされたものである場合はラムダ) に接続するselectedItemことをお勧めします。if

QMenu myMenu;
QAction *action1 = myMenu.addAction("first");
QAction *action2 = myMenu.addAction("second");
connect(action1, &QAction::triggered, [](){/*lambda code here*/});
connect(action2, &QAction::triggered, [](){/*lambda code here*/});
myMenu.exec(statusWidget->mapToGlobal(pos));

EDIT:Qt4の場合、スロットと古い接続構文を使用します:

QMenu myMenu;
QAction *action1 = myMenu.addAction("first");
QAction *action2 = myMenu.addAction("second");
connect(action1, SIGNAL(triggered()), this, SLOT(doStuff()));
connect(action2, SIGNAL(triggered()), this, SLOT(doOtherStuff()));
myMenu.exec(statusWidget->mapToGlobal(pos));

これが機能するには、"doStuff" と "doOtherStuff" を、引数を取らないヘッダー内のスロットとして宣言する必要があります (シグナルに引数QAction::triggered()がないため)。実行したいコードは、これらのスロットの定義に移動します。

class RView
{
public slots:
    void doStuff() { /*do stuff*/ }
    void doOtherStuff() { /*do other stuff*/ }
};
于 2016-11-26T18:32:22.693 に答える