2017-03-31 4 views
0

Je suis relativement nouveau à Qt et je suis coincé avec essayer de comprendre comment avoir différents boutons retournent chacun une valeur spécifique quand ils sont cliqués.J'ai lu à travers le Qt doc sur les signaux et les slots mais je n'ai pas trouvé quelque chose d'utile.Comment avoir plusieurs boutons Qt retourner chaque valeur différente

Je sais que je peux juste avoir utilisé la fonction cliquée et retourner une valeur en utilisant les "goto slots" mais, à partir de la principale, je voudrais simplement appeler une fonction getChoice qui ouvrirait une nouvelle fenêtre et sur quoi l'utilisateur clique je retournerais un int correspondant que je peux utiliser pour plus tard. Quelque chose comme ça est ce que cela donnerait à partir du principal.

OptionMenuWindow option; 
int choice = option.checkChoice(); 

Donc ceci est mon code dans la classe OptionMenuWindow et j'ai essayé passer un entier comme référence par la fente de sorte que lorsque choice0Clicked est activé, je sais que le bouton a été cliqué.

int OptionMenuWindow::checkChoice(){ 

this->show(); 
QEventLoop waitForResponse; 

//THIS IS WHERE I TRY AND DO THAT 
connect(ui->manageEmployee, SIGNAL (clicked()), &waitForResponse, SLOT(choice0Clicked())); 

connect(ui->view, SIGNAL (clicked()), &waitForResponse, SLOT(choice1Clicked())); 

connect(ui->generatePayroll, SIGNAL (clicked()), &waitForResponse, SLOT(choice2Clicked())); 

waitForResponse.exec(); 

cout << "here" << endl 
cout << choice << endl; 
return choice; 

} 
void OptionMenuWindow::choice0Clicked() 
{ 
    choice = 0; 

} 

void OptionMenuWindow::choice1Clicked() 
{ 
    choice = 1; 
} 

void OptionMenuWindow::choice2Clicked() 
{ 
    choice = 2; 
} 

Le choix est défini dans le fichier d'en-tête.

C'est l'erreur que je reçois:

QObject :: connect: Aucun QEventLoop slot :: choice0Clicked (& choix)

QObject :: connect: (nom de l'expéditeur: « manageEmployee «)

QObject :: connect: Aucun emplacement QEventLoop :: choice1Clicked (& choix)

QObject :: connect: (nom de l'expéditeur: 'view')

QObject :: connect: Aucun QEventLoop slot :: choice2Clicked (& choix)

QObject :: connect: (nom de l'expéditeur: 'generatePayroll')

Je crois vraiment qu'il ya un mieux de le faire donc s'il y en a, quelqu'un peut-il l'expliquer?

Et s'il y a quelque chose que vous avez besoin de moi pour élaborer, s'il vous plaît dites-moi dans les commentaires.

Merci

+0

Vous faites des bêtises, [la signature d'un signal doit correspondre à la signature de l'emplacement connecté] (https://doc.qt.io/qt-5/signalsandslots.html#signals-and-slots). Essayez de suivre l'un des [exemples de Qt] (https://doc.qt.io/qt-5/gettingstartedqt.html), et voyez comment ça se passe quand on clique sur un bouton – Mike

Répondre

0

Vous ne pouvez pas surcharger un emplacement. Cela devrait correspondre à la signature du signal.

Il devrait être quelque chose comme cela ne

QObject::connect(ui->manageEmployee, SIGNAL (clicked()), &waitForResponse, SLOT(choice0Clicked())); 

QObject::connect(ui->view, SIGNAL (clicked()), &waitForResponse, SLOT(choice1Clicked())); 

QObject::connect(ui->generatePayroll, SIGNAL (clicked()), &waitForResponse, SLOT(choice2Clicked())); 

Venons-en maintenant à l'indexation bouton

Supposons que vous avez des boutons-poussoirs - "button1", "button2" et "button3" .

Créer un objet "QButtonGroup".

QButtonGroup *bGroup = new QButtonGroup(); 

Ajoutez tous les boutons avec Ids.

bGroup->addButton(button1, 0); 
bGroup->addButton(button2, 1); 
bGroup->addButton(button3, 2); 

Maintenant, dans les fentes pour obtenir l'ID du bouton:

void OptionMenuWindow::choice0Clicked() 
{ 
     QPushButton* button = qobject_cast<QPushButton*>(sender());   
     int buttonID = bGroup->id(button);  
} 

void OptionMenuWindow::choice1Clicked() 
{ 
    QPushButton* button = qobject_cast<QPushButton*>(sender());  
    int buttonID = bGroup->id(button); 
} 

void OptionMenuWindow::choice2Clicked() 
{ 
    QPushButton* button = qobject_cast<QPushButton*>(sender());  
    int buttonID = bGroup->id(button); 
} 
+0

Il n'y a pas de fonction comme 'QPushButton :: id() '. De quoi es-tu en train de parler dans ton dernier paragraphe? – Mike

+0

Je suis désolé mais j'ai un choix int int la fonction choiceChecker qui est supposée renvoyer un int. Quel int vais-je retourner dans ce cas? –

+0

@ismailyussuf, pourquoi avez-vous besoin de l'int pour être retourné? il suffit de le déclarer comme membre de votre classe 'OptionMenuWindow' (si vous voulez enregistrer l'état du bouton sur lequel vous avez cliqué) et de manipuler cet int en fonction du bouton sur lequel vous avez cliqué. Vous pouvez faire des opérations GUI dans la fente connectée au signal 'clicked' (pour montrer le feedback à l'utilisateur). . . – Mike

0

Vous pouvez utiliser QSignalMapper.

De Qt Assistant:

Cette classe rassemble un ensemble de signaux sans paramètre, et les réémet avec entier, chaîne ou paramètres du widget correspondant à l'objet qui a envoyé le signal

signalMapper = new QSignalMapper(this); 

    for (int i = 0; i < texts.size(); ++i) { 
     QPushButton *button = new QPushButton(texts[i]); 
     connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 
     signalMapper->setMapping(button, texts[i]); 
    } 

    connect(signalMapper, SIGNAL(mapped(QString)), 
      this, SIGNAL(clicked(QString)));