Se connecter / S'enregistrer

Résolu Repérer 2ème clic sur QPushButton

Solutions (7)
Tags :
  • Application web
  • Arrière plan
  • Programmation
|
salut camarades,
je fais un jeu d'échecs en c++ et qt.
j'ai fais le plateau de jeu avec un QgridLayout.
je cherche maintenant à déplacer les pièces.
Pour cela, j'ai fait des connect sur chaque case pour que lorsqu'on clique sur une case, en fonction de la pièce présente les cases contenant les possibilités de déplacement se grisent.

Il faut ensuite que si on clique sur une des cases possibles la pièce prenne la nouvelle place ou si le deuxième clic est sur une autre pièce il faut que ça propose les possibilités pour cette pièce.

Je ne sais pas si je me suis bien expliqué.
En fait je veux savoir comment déterminer la présence d'un deuxième clic après qu'on ait cliqué sur une des pièces.
Pour l'instant tout ce que ça fait c'est proposé les possibilités à chaque fois que je clique sur une case.

J'espère que vous m'avez compris, voila un bout de code pour le connect
  1. void Fenetre::clicBouton01()
  2. {
  3. Piece*** plateau=e->getPlateau();
  4. vector< pair<int, int> > possibilites;
  5. possibilites=plateau[7][1]->chercherDeplacement(e);
  6. for(vector< pair<int, int> > ::iterator it=possibilites.begin();it!=possibilites.end();++it)
  7. {
  8. QLayoutItem *item=layout->itemAtPosition(7%it->first,it->second);
  9. QWidget *wid=item->widget();
  10. wid->setStyleSheet("background-color: grey;" );
  11. }
  12. }

donc pour chaque possibilité de case je la grise.

Donc comment faire pour le deuxième clic?
J'en profite pour une autre question : une fois ces cases grisées, si je clic sur une autre pièce, ça grise les cases correspondant à ses possibilités mais les cases grisées précedemment le sont toujours.
Comment leur redonner leur couleur originale?

Je vous remercie d'avance de vos réponses et de votre temps
Contenus similaires
  • Autres pages sur : reperer clic qpushbutton
Meilleure solution
partage
|
J'allais dire que tu peux faire ton propre bouton (une classe qui hérite de QButton) pour y ajouter le signal.
J'ai aussi pensé au faux container, puis j'ai regardé la doc, et j'ai vu qu'en fait c'est déjà implémenté. Il te faut utiliser QButtonGroup
  • Commenter cette solution |
Score
0
òh
òi
|
Meilleure réponse sélectionnée par mcpherson.
  • Commenter cette réponse |
Score
0
òh
òi
|
d'accord merci pour la simplification, je commencais à me compliquer en faisant une fonction qui prend en paramètre l'id de 0 à 63 et qui le transforme en pair avec les coordonnées correspondantes!

merci beaucoup ça devrait le faire maintenant
  • Commenter cette réponse |
Score
0
òh
òi
|
Peu importe la façon dont ils sont rangés dans le QButtonGroup. Dans ta classe Fenetre, il te suffit d'utiliser un dictionnaire (QDict) dont la clé est l'id du bouton et dont la valeur est ton pair<int, int>.
Avec ça, dans ton slot, tu as l'id, et il te suffit de faire tonDict[id] pour retrouver ta paire.
Il te faut evidemment remplir et vider ton dictionnaire correctement. ;) 
  • Commenter cette réponse |
Score
0
òh
òi
|
edition du message.

Je disais que je ne comprenais rien mais finalement je crois que ça commence à venir.
il y a un signal buttonClicked(int id) où id est l'indice du bouton dans le buttonGroup.
Le problème c'est que moi il faudrait que le id soit un pair<int,int>. ce pair contient en fait les coordonnées du bouton et c'est adapté pour ma conception car mon échiquier est une matrice dans laquelle j'accède par plateau[j], de la même manière j'accède de cette façon dans le gridLayout. Il faudrait donc que les boutons dans le buttonGroup soient rangés de cette meme façon.
je pensais donc faire une classe qui hérite de QButtonGroup et ensuite redéfinir le signal ButtonClicked pour qu'il prennent en paramètre un pair<int,int> et aussi faire un addButton qui prend en paramètre le bouton et un pair<int,int> au lieu du int id.

sauf que je vois pas comment faire ça du tout et je sais meme pas si c'est faisable.
y a t-il une autre solution pour que dans le slot je récupère un pair<int,int> avec donc les coordonnées du bouton cliqué?

en tout cas merci beaucoup des éclaircissements
  • Commenter cette réponse |
Score
0
òh
òi
|
pendant quelques secondes j'ai cru comprendre mais la je me reperd.
en fait je vois pas où je pourrai mettre ce paramètre.
voila un bout du code ça sera plus simple peu etre.
dans le constructeur de Fenetre, à la fin je fais les connect sur chaque bouton de cette façon :
  1. QObject::connect(bouton00, SIGNAL(clicked()), this, SLOT(clicBouton00()));

et donc le code du slot je l'ai donné précedemment.
Alors le paramètre s'il faut le mettre en paramètre du slot oui mais comment je peux connaitre celui qui a été cliqué à ce moment là?

enfin je suis troublé :) 

pourrai-tu m'expliquer un poil plus s'il te plait?
  • Commenter cette réponse |
Score
0
òh
òi
|
Tu peux faire un connect des signaux des boutons sur le slot de Fenetre en faisant passer un paramètre qui permet d'identifier l'objet qui a été cliqué (ou les coordonnées).
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS