2016-11-26 14 views
1

아래 코드를 인용했습니다. 문제는 설명하기 쉽습니다. selectedItem-> text는 메뉴에서 선택된 액션을 변경하는 올바른 방법이 아닙니다. 그것을 올바르게하는 방법?QAction 트리거를 식별합니다.

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 
} 
} 
+0

*** 올바른 방법? *** 신호 및 슬롯을 가장 많이 사용합니다. QAction 트리거 신호를 RView 클래스의 슬롯에 연결하십시오. – drescherjm

답변

1

당신은 오히려 직접 QAction의를 비교해야하고 그들이에 국한 한 시간 가지 경우 중 당신이로 if들에 selectedItem의 비교를 사용하거나 더 나은 아직 원하는 슬롯에 각 동작을 연결 (또는 람다 이 문맥).

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)); 

편집 : 헤더의 슬롯 복용으로 선언 할 수는 "doStuff"와 "doOtherStuff"를해야합니다 작업이 들어

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)); 

: QT4를 들어 슬롯 오래된 연결 구문을 사용합니다 인수 없음 (신호 QAction::triggered()에 없음). 완료하려는 코드는 다음 슬롯의 정의로 이동합니다.

class RView 
{ 
public slots: 
    void doStuff() { /*do stuff*/ } 
    void doOtherStuff() { /*do other stuff*/ } 
}; 
+0

컴파일러가 – tux007

+0

을 트리거 한 것을 모르고 람다 코드에 무엇을 붙여야합니까? – tux007

+0

QObject가 아닌 QAction이 있어야합니다. 그것을 정정했다. 그리고 람다 코드는 그 액션이 트리거 될 때 당신이해야 할 일은 무엇이든합니다. OP에서 "// 뭔가를하십시오"및 "// 다른 것들을하십시오". – Resurrection