2013-02-05 3 views
2

J'ai un QMenu qui a plusieurs éléments de menu construits dynamiquement. Pour cela, parcourez une collection d'éléments de menu, contenant le nom et l'action (qui devraient être pris si l'élément de menu a été touché), et continuez à les ajouter au menu contextuel. Tous les éléments de menu doivent être connectés à un emplacement commun.Travailler avec un QMenu et passer des arguments

Mais d'une manière ou d'une autre, l'action de déclenchement ne se produit pas. c'est-à-dire que l'instruction connect est atteinte, mais que le contrôle ne passe pas dans le SLOT spécifié, aucune action n'est prise.

for (int i=0; i<Action_List.size();i++) 
{ 
    tempAct1 = Action_List.at(i); //Action List has the list of Actions 
    Context_Menu->addAction(tempAct1); 
} 
if (Context_Menu!=NULL) { 
    Context_Menu->exec(QCursor::pos()); 
    int r = connect(Context_Menu, SIGNAL(triggered(QAction *)), 
        this, SLOT(SPlusCommand(QAction *))); 
} 

int P14MainWindow::SPlusCommand (QAction* Action) 
{ 
    QVariant tempstr = Action->data(); 
    QString Qs = tempstr.toString(); 
    return QPwLocalClient::ExecuteCommand(Qs); 
} 

Quelqu'un peut-il me dire où je me trompe, s'il vous plaît?

Répondre

4

Il semble que vous devez déplacer connectavantexec():

connect(Context_Menu, SIGNAL(triggered(QAction *)), 
     this, SLOT(SPlusCommand(QAction *))); 
Context_Menu->exec(QCursor::pos()); 

Parce que exec exécute le menu synchrone, ce qui signifie qu'il sera de retour de cette méthode que lorsque toutes vos interactions avec le menu est terminé - trop tard pour connecter quelque chose après.

+0

Merci beaucoup. Ça a bien marché. – user1173240

-2

Vous devrez connecter les actions individuelles avec votre emplacement.

connect(action, SIGNAL(triggered()), this, SLOT(yourSlot()) 
+0

Pas tout à fait raison, car il veut savoir à partir de l'emplacement quelle action a été invoquée. Le signal 'QMenu :: triggered (QAction *)' est également légitime, et comme le dit [documentation] (http://doc.qt.digia.com/stable/qmenu.html#triggered), il est fait juste pour cette raison : lorsque vous connectez plusieurs actions * similaires * au même emplacement. – NIA

Questions connexes