2010-11-09 6 views
0

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?

+0

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

+0

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

+0

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

Répondre

3

Lorsque vous faites this->x_id vous obtenez la position x du RECT, pas votre clic de souris. Vous devez faire event->::pos() pris de l'événement. Les documents sont here.

+0

Je sais, mais 'x_id' et' y_id' personnalisés-définis. La première case de la deuxième ligne a 'x_id' 0 et' y_id' 1, et ainsi de suite. (J'ai juste remarqué que j'utilise mal X et Y, je corrigerai cela plus tard.) – Pieter

+0

J'ai mis à jour mon code et ma question. J'espère que cela clarifie une certaine confusion sur ce que j'ai fait avec 'x_id' et' y_id'. – Pieter

+0

Êtes-vous entièrement sûr que vous définissez correctement x_id (row_id) et y_id (col_id) lorsque vous initialisez les objets? Serait-il possible de voir plus de code (principalement concernant l'initialisation de votre objet 'BoardTile') – g19fanatic