2014-06-13 3 views
0

Mon application est très simple, j'ai deux boutons, le premier bouton son texte +, et le second son texte -.
Ensuite, je veux quand cliquez sur l'un des boutons, je reçois le texte du bouton que j'ai cliqué.Obtenez le texte du bouton lorsque vous cliquez sur l'un des boutons

Et ce qui suit est la méthode qui a appelé lorsque vous cliquez sur l'un des boutons.

void Widget::btns_clicked() 
{ 
     QPushButton *btn = dynamic_cast<QPushButton*>(sender()); 
     char _operator = btn->text(); 

     switch(_operator){ 
     case '+': 
      QMessageBox::information(this, "Status", "You have clicked on (+)"); 
      break; 
     case '-': 
      QMessageBox::information(this, "Status", "You have clicked on (-)"); 
      break; 
     } 
} 

Mais apparaître le message d'erreur suivant:
cannot convert from 'QString' to 'char'

J'ai aussi une autre petite Renseignez-
est il y a une autre façon la plus simple de le faire: dynamic_cast<QPushButton*>(sender());?

+1

'char' est un caractère. 'text()' renvoie une chaîne. – chris

+0

@chris: Merci, mais comment convertir. –

+0

Eh bien, sans doute, vous voudrez vous assurer que la chaîne est un caractère et saisir le premier. – chris

Répondre

1

btn-> (texte) retours QString, qui n'est pas un type C++ natif, donc vous devez le convertir en std :: string en premier. Si vous regardez les QString docs (par exemple via Qt Assistant) vous verrez là le toStdString() fonction qui fait exactement cela:

std::string _operator = btn->text().toStdString(); 

En outre, notez que je l'ai utilisé chaîne au lieu de char car vous ne pouvez pas assigner de chaîne à char. Mais ce n'est pas problème puisque la chaîne est juste un ensemble d'éléments de char, et donc nous pouvons utiliser _operator [0] dans le commutateur:

switch(_operator[0]){ 
    case '+': 
... 

Cela résoudrait votre problème actuel et ainsi se termine la réponse. Une suggestion: pourquoi ne pas utiliser des emplacements différents pour chaque bouton afin de savoir immédiatement sur quel bouton a été cliqué?

De plus, vous n'avez pas du tout besoin d'un commutateur dans votre code actuel. Vous pouvez simplement imprimer des informations comme ceci:

QMessageBox::information(this, "Status", "You have clicked on (" + _operator + ")"); 

et vous obtiendrez toujours le bon message, quel que soit le bouton cliqué.

+0

Votre explication très claire, je suis maintenant compris. Merci beaucoup. Qu'en est-il de la deuxième enquête, si vous le savez? –

+0

Comme je l'ai écrit dans la réponse, une autre façon de le faire est de créer deux emplacements séparés pour le bouton '+' et '-' et de leur connecter les boutons respectifs; De cette façon, vous n'avez pas besoin de lancer quoi que ce soit, car vous savez immédiatement sur quel bouton a été cliqué, car cliquer sur le bouton déclenchera le bon emplacement.Je ne connais aucune autre option simplifiant cela. – KjMag

+0

Merci, mais je veux dire 'dynamic_cast (sender());' est-il possible d'obtenir les données que l'expéditeur détient sans utiliser 'dynamic_cast'. par exemple 'QPushButton * btn = sender();'. ** Remarque: ** le code qui dans ma question est juste un petit exemple pour expliquer mon problème, mais ce n'est pas le vrai code que j'ai utilisé. –

Questions connexes