IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Position de la souris dans QGraphicsView (problème à la fermeture de l'application)

  1. #1
    Membre confirmé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Points : 528
    Points
    528
    Par défaut Position de la souris dans QGraphicsView (problème à la fermeture de l'application)
    Bonsoir tout le monde,

    Sous QtCreator, je voudrais afficher à un endroit donné de ma class QMainWindow personnalisée (qui n'importe pas ici) la position en X et Y du curseur de la souris à chaque instant lors de son déplacement dans la zone centrale de ma fenêtre principale. Ceci impose que je stocke dans deux variables posX et posY la position du curseur à chaque instant.

    La zone centrale est un objet Vue, dont la class hérite de QGraphicsView. J'ai donc réimplémenté à l'intérieur de cette class la méthode void mouseMoveEvent(QMouseEvent *event); pour avoir les positions en X et en Y du curseur.

    Tout fonctionne correctement à part losque je ferme mon application en cliquant sur la croix de ma fenêtre ou sur Quitter dans mon menu. J'ai alors une fenêtre d'erreur avec le message :

    geometryApplication.exe has encountered a problem and needs to close. We are sorry for the inconvenience.
    Pour plus de clarté, vous avez ci-dessous un screen de la fenêtre que je rencontre lors de la fermeture de l'application.

    Cette fenêtre s'affiche lorsque les lignes suivantes ne sont pas en commentaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    posX = event->pos().x();
    posY = event->pos().y();
    Voici tout de même le contexte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include "vue.h"
    #include <QWidget>
    #include <QtGui>
    #include <iostream>
    #include <QMouseEvent>
     
    Vue::Vue(QWidget *parent) : QGraphicsView(parent)
    {
        scene = new Scene();
        this->setScene(scene);
    }
     
    void Vue::mouseMoveEvent(QMouseEvent *event)
    {
    //qDebug("%d %d",event->pos().x(),event->pos().y());
    posX = event->pos().x();
    posY = event->pos().y();
    qDebug("%d %d",posX,posY);
    QWidget::mouseMoveEvent(event);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #ifndef VUE_H
    #define VUE_H
     
    #include <QtGui>
    #include "scene.h"
     
    class Vue : public QGraphicsView
    {
    public:
        Vue(QWidget *parent = 0);
     
    private:
        Scene *scene;
        int posX;
        int posY;
     
    protected:
     
        virtual void mouseMoveEvent(QMouseEvent *event);
     
    };
     
    #endif // VUE_H
    Si jamais vous avez une idée, n'hésitez pas

    Merci !

    PS : lorsque je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    posX = event->pos().x();
    posY = event->pos().y();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qDebug("%d %d",event->pos().x(),event->pos().y());
    directement, sans retenir la valeur dans deux variables posX et posY, il n'y a plus de problème.
    Images attachées Images attachées  

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Points : 359
    Points
    359
    Par défaut
    C'est le message classique de windows en cas de crash.

    Le plus simple dans ce cas: recompile en debug et lance ton application en debug ; quand elle va crasher, affiche la stacktrace dans Qt creator, tu verras la ligne exacte qui est responsable du crash.

    Un crash peut avoir de multiples causes, division par zéro, pointeur null, pointeur "dangling" (pointant sur un espace mémoire déjà détruit)...

    En lisant ton code je ne vois pas trop ce qui pourrait déconner, Qt ne devrait pas envoyer un event null dans mouseMoveEvent(QMouseEvent *event), ni n'envoyer d'event si ton objet.

    J'ai fait un copier / coller de ton code, juste en supprimant la partie "Scene", et je n'ai aucun crash en Qt 4.7.1 / VC 2010 / Win 7, ton problème doit sans doute être ailleurs, et le plus simple est d'utiliser le debugger de Qt Creator pour trouver.

  3. #3
    Membre confirmé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Points : 528
    Points
    528
    Par défaut
    Citation Envoyé par sysedit
    Le plus simple dans ce cas: recompile en debug et lance ton application en debug ; quand elle va crasher, affiche la stacktrace dans Qt creator, tu verras la ligne exacte qui est responsable du crash.
    J'ai essayé de lancer le mode debug mais je t'avouerais que je n'arrive pas à interpréter l'erreur :s

    Je ne pense pas que ca va vous aider beaucoup non plus mais bon on ne sait jamais.

    Enfin bon ca n'affecte pas le fonctionnement de mon application mais c'est moche quand on ferme le programme quand même :p

    Pour information, je suis sur QtCreator2.1 avec Qt 4.7.1 et Windows XP.

    Aussi, lorsque je passe par le débug, il n'y a pas la fenêtre de crash de Windows à la fin de celui-ci... (je ne pense pas que ce détail soit important mais bon)

    Merci

    Edit : Après des tests sur mon application, il semblerait que ce soit un problème de mémoire. En fait, lorsque je lance QCreator, et que j'exécute le programme, si je quitte sans être allé dans la zone centrale ou très peu (donc PosX et PosY sollicités aucune fois ou très peu), aucun message de crash de Windows. Par contre, si je m'amuse avec ma souris dans la zone centrale en la faisant aller un peu partout, lorsque je quitte l'application avec la croix ou le sous-menu quitter, là elle apparaît...

    Mais je ne sais pas vraiment comment y remédier ^^

    Si vous avez une idée je vous écoute

    Merci !
    Images attachées Images attachées  

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Points : 359
    Points
    359
    Par défaut
    Je ne connais quasiment pas mingw (j'utilise uniquement Visual C++), mais ce genre de message semble dire qu'un espace mémoire a été détruit plusieurs fois (enfin: il rale parce que l'espace mémoire qu'il est censé détruire n'est déjà plus valide).


    Vérifie tes delete, et fais aussi attention au fait que Qt, par défaut, détruit tous les fils d'un QObject si tu détruis ce QObject.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <QObject>
    #include <QApplication>
    #include <QDebug>
     
    int main(int argc, char ** argv)
    {
      QApplication app(argc, argv);
      QObject * a = new QObject();
      QObject * b = new QObject(a);
      delete a;
      delete b;
    }
    Ce code va crasher, parce que b est détruit par la destruction de a.

    Au pire, mets ton projet en pj, si j'ai un moment je regarde si je reproduis chez moi.

Discussions similaires

  1. [Lazarus] Position de la souris dans un TMemo
    Par ChPr dans le forum Lazarus
    Réponses: 11
    Dernier message: 25/05/2012, 16h41
  2. position due la souris dans le richtextbox
    Par TaymouWan dans le forum Windows Forms
    Réponses: 11
    Dernier message: 01/04/2009, 15h40
  3. Détecter la position de la souris dans une fonction
    Par polemoss dans le forum jQuery
    Réponses: 5
    Dernier message: 19/03/2009, 09h28
  4. Position de la souris dans un Memo
    Par greg778 dans le forum Delphi
    Réponses: 17
    Dernier message: 27/11/2006, 21h32
  5. Position de la souris dans une form
    Par planetevoyage dans le forum Delphi
    Réponses: 3
    Dernier message: 12/10/2006, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo