Pour me familiariser avec la vue graphique de Qt, j'implémente un simple échiquier dans Qt. Il n'y a pas de pièces d'échecs, pour le moment.mousePressEvent ne pas lier correctement?
J'utilise des rectangles pour représenter chaque tuile, donc j'ai créé la classe BoardTile
(qui hérite de QGraphicsRectItem
) afin que je puisse définir un mousePressEvent
.
Voici un petit code de test que j'associé avec le clic de la souris:
void BoardTile::mousePressEvent(QGraphicsSceneMouseEvent *event) {
QMessageBox mesg;
std::stringstream mesgText;
mesgText << "Clicked tile (" << this->row_id << ", " << this->col_id << ").";
mesg.setText(QString::fromStdString(mesgText.str()));
mesg.exec();
}
Lorsque je clique sur la première tuile sur la deuxième ligne, je reçois le message suivant:
carreaux clicked (1, 0)
Ensuite, lorsque je clique sur une autre tuile, j'obtiens exactement le même message. Le contenu du message dépend de la première case sur laquelle j'ai cliqué. Pourquoi est-ce? Ai-je lié le mousePressEvent
incorrectement?
code complet http://www.box.net/shared/4m6nrvuxa4(mise à jour 1)
Mise à jour 2: J'ai remarqué que si je mets event->ignore();
après mesg.exec()
, il fonctionne très bien. Je sais que ce n'est pas une solution (car cela conduira probablement à toutes sortes de comportements étranges), mais je veux savoir pourquoi cela fonctionne. Cela révèle-t-il quelque chose de crucial à propos d'éventuelles erreurs que j'ai faites dans ma mise en œuvre?
Mise à jour 3: Quelqu'un m'a dit que je devrais essayer de changer mousePressEvent
en mouseReleaseEvent
. Curieusement, cela fonctionne. Pour autant que je sache, la seule différence entre les deux événements est que le premier est déclenché lorsque vous appuyez sur le bouton de la souris et le dernier lorsque vous relâchez ce bouton. Alors pourquoi mouseReleaseEvent
déclenche-t-il le comportement souhaité et mousePressEvent
non?
Comment liez-vous? Créez-vous manuellement la connexion en utilisant 'connect()'? Ou permettez-vous à Qt de le faire lui-même dans le MOC? – g19fanatic
Je ne fais pas la reliure moi-même. Je m'assure juste qu'il y a une fonction 'mousePressEvent' qui devra être exécutée quand l'élément est cliqué. – Pieter
en ce qui concerne la mise à jour 2: 'event-> ignore()' indique essentiellement que vous voulez que l'événement ne se termine pas avec ce gestionnaire mais propogate éventuellement (sp?) À un autre gestionnaire (si présent). Je ne sais pas pourquoi cela fonctionne, car je ne peux pas voir votre code, car le lien ne fonctionne pas pour moi. – g19fanatic