2016-11-26 4 views
1

ci-dessous j'ai cité mon code. Le problème est facile à décrire. selectedItem-> text n'est pas la bonne façon de différencier l'action sélectionnée dans le menu. Comment le faire correctement?identifier un déclencheur de 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

*** Comment faire les choses correctement? *** Utilisation la plus probable de signaux et de slots. Connectez votre (vos) signal (s) déclenché (s) QAction aux slots de votre classe RView. – drescherjm

Répondre

1

Vous devriez plutôt comparer les QAction s directement et soit utiliser la comparaison des selectedItem comme vous le faites dans vos if s ou mieux encore se connecter chaque action à l'emplacement souhaité (ou lambda si elles sont une fois les choses localisées à ce contexte).

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: Pour Qt4 vous utiliseriez machines à sous et ancienne syntaxe de connexion:

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

Pour que cela fonctionne, vous aurez besoin « doStuff » et « doOtherStuff » à déclarer que les créneaux horaires dans votre tête prise pas d'arguments (car le signal QAction::triggered() n'en a pas). Le code que vous voulez faire ira aux définitions de ces emplacements:

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

le compilateur ne sait pas déclenché – tux007

+0

et que dois-je coller pour le code lambda? – tux007

+0

Désolé, aurait dû être QAction, pas QObject. Corrigé Et le code lambda est ce dont vous avez besoin lorsque cette action est déclenchée. Le "// faire quelque chose" et "// faire d'autres choses" dans OP. – Resurrection