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

Qt Discussion :

Évènement QGraphicsItem non déclenché [Graphics View]


Sujet :

Qt

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut Évènement QGraphicsItem non déclenché
    Bonjour,

    Je suis actuellement en train de coder (pour simplifier) une visionneuse d'image comportant:
    - un QMainWindow dans lequel j'ai 2 QWidget se composant chacune d'une QGraphicsScene, pour afficher 1 QGraphicsItem (une image) dans chaque scene.

    L'affichage des images marche. Aucune erreur de compilation.

    Mon but est de réupérer dans ma QMainWindow un evenement du QGraphicsItem me permettant de récupérer les coordonnées de la souris dans l'item.

    Tout d'abord ma classe ImageGPS qui hérite de QGraphicsItem et QObject pour gérer les signaux.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    //Fichier ImageGPS.h
    class ImageGPS : public QObject, public QGraphicsItem
    {
        Q_OBJECT
     public:
         ImageGPS(const QString, int x, int y);
         void charger();
         QRectF boundingRect() const;
         QPainterPath shape() const;
         void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
     
         QString get_path();
         QString get_name();
         void ExtractName();
     
         void mousePressEvent(QMouseEvent *event);
         void hoveMoveEvent(QGraphicsSceneHoverEvent * event);
     signals:
         void SendCoord(QString str);
         void SendhoveMoveEvent(QGraphicsSceneHoverEvent * event);
     private:
         int x,y;
         QImage Image;
         QString Path;
         QString Name;
    };
     
    //Fichier ImageGPS.cpp
    ...
     void ImageGPS::mousePressEvent(QMouseEvent *event)
     {
        qDebug() << "POUET\n"; //Jamais affiché
        //QGraphicsItem::mousePressEvent(event);
        QPointF pt = event->posF();
        QString str = "X : ";
        str += pt.x();
        str += "  Y : ";
        str += pt.y();
        emit this->SendCoord(str);
     }
     
     void ImageGPS::hoveMoveEvent(QGraphicsSceneHoverEvent * event)
     {
        qDebug() << "hoveMoveEvent\n"; // Jamais affiché
        /*QPointF pt = event->scenePos();
        QString str = "X : ";
        str += pt.x();
        str += "  Y : ";
        str += pt.y();
        emit this->SendCoord(str);*/
        //QGraphicsItem::hoverMoveEvent(event);
        SendhoveMoveEvent(event);
     
     }
    ...
    Ensuite ma classe MyMainWindow heritant de QMainWindow dans lequel j'essaye de récupérer le signal émis, plus précisement la fonction qui est censée connect les ImageGPS aux slots.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    //Fichier MyMainWindow.h
    class MyMainWindow : public QMainWindow
    {
        Q_OBJECT
    public:
        MyMainWindow();
    private slots:
        void addimage();
        void ChargerScene(QTreeWidgetItem*,int);
        void RecupCoor(QString str);
        void RecupCoord(QGraphicsSceneHoverEvent*);
    private:
        MainWindow *Main;
        QMenuBar *Menu;
        QMenu* MenuFile;
        QTreeWidget *Tree;
        QSplitter *mh1Splitter;
        QSplitter *mh2Splitter;
        QVector<ImageGPS*> LImages;
    };
     
    //Fichier MyMainWindow.cpp
    ...
    void MyMainWindow::addimage()
    {
     
        QStringList List = QFileDialog::getOpenFileNames(this,
                                                         "Choisir un dossier",
                                                         "/home","Images (*.png *.JPG *.jpg)");
        int SizeInit = this->LImages.size();
        for(int i = 0; i < List.size();++i)
        {
            this->LImages.push_back(new ImageGPS(List.at(i),0, 0));
            connect(this->LImages[i], SIGNAL(SendCoord(QString)), this, SLOT(RecupCoor(QString)));
            connect(this->LImages[i], SIGNAL(SendhoveMoveEvent(QGraphicsSceneHoverEvent*)), this, SLOT(RecupCoord(QGraphicsSceneHoverEvent*)));
        }
     
        connect(this->LImages[0], SIGNAL(SendCoord(QString)), this, SLOT(RecupCoor(QString)));
        QList<QTreeWidgetItem *> items;
        int k = 0;
        for(int i = SizeInit; i < this->LImages.size();++i)
        {
            items.append(new QTreeWidgetItem(QStringList(this->LImages.at(i)->get_name())));
            items[k]->setData(1, 0, i);
            ++k;
        }
        Tree->insertTopLevelItems(0, items);
        Tree->sortByColumn(1,Qt::AscendingOrder);
    }...
    Vous remarquerez que j'ai aussi un QTreeWidget pour stocker le nom des images (et faire l'association de leur position, stockée dans un 2eme colonne cachée, dans le QVector.);

    Donc la question est: Pourquoi les evenements des objects ImageGPS ne sont-ils pas déclenchés, et donc les signaux émis?

    Merci

  2. #2
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2008
    Messages : 55
    Par défaut
    je trouve étrange que le paramètre de mousePressEvent soit un QMouseEvent.
    Quand il s'agit de GraphicsItem c'est des QGraphicsSceneMouseEvent.

    Ca vient peut-être de là?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    Bonjour,

    J'ai un peu modifié le code est effectivement le profil est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ImageGPS::mousePressEvent(QGraphicsSceneMouseEvent *event)
    Cependant une fois cela modifié le signal est passé une fois après recompilation et marche que très très rarement par la suite.. une idée?

    Merci

    PS: "passé => envoyé et reçu par MyMainWindow

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    Bonjour,

    Je reviens vers vous car je n'ai toujours pas résolu mon problème.

    Le problème vient je pense des objets ImageGPS dont l'évènement mousePressEvent n'est pas détecté.

    La fonction n'est jamais déclenchée, je n'ai jamais l'affichage des 2 textes dans qDebug()...
    Le profil du signal a un peu été modifié depuis la dernière fois mais cela ne change pas grand chose (je pense..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void ImageGPS::mousePressEvent(QGraphicsSceneMouseEvent *event)
     {
        qDebug() << "mousePressEvent\n";
        QPointF pt = event->scenePos();
        qDebug() << "pt.x : " << pt.x() << " pt.y  : " << pt.y() << '\n';
        emit this->SendCoord(pt.x(), pt.y());
        this->update();
     }
    Un paramètre de l'héritage Qobject et/ou QGraphicsItem à mettre à true quelque part? Je n'ai toujours pas trouvé.

    J'espère que vous pourrez m'aider,

    Merci

  5. #5
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Par défaut
    Tu n'aurais pas setAcceptedMouseButtons() à false par hasard. Même si il est à true par défaut...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    Bonjour,

    setAcceptedMouseButtons() ne se met pas à true ou false, il demande un Qt::MouseButtons, j'ai essayé de rajouter Qt:LeftButton mais ça ne change rien (je peux mettre setAceptedMouseButtons(0) pour tous les désactiver mais c'est tout.)

    Merci

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Par défaut
    Re,

    Le problème ne s'est pas présenté à johnlamericain lors de l'execution de mon code, mais personnellement en modifiant la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     QPainterPath ImageGPS::shape() const
     {
         QPainterPath path;
         //path.addRect(14, 14, 82, 42);
         path.addRect(this->boundingRect());
         return path;
     }
    le problème a disparu. (j'ai remplacé la ligne en commentaire par celle en dessous).


    Le problème étant résolu je clôture la discussion.

    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/05/2007, 21h34
  2. Gestion d'exception non déclenchée
    Par Duan dans le forum Delphi
    Réponses: 4
    Dernier message: 01/03/2007, 15h15
  3. mouseMoved -> pertes ou événements non déclenchés
    Par karibouk dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 16/10/2006, 15h55
  4. Gestionnaires d'évènements non déclenchés
    Par Sylvain James dans le forum XMLRAD
    Réponses: 7
    Dernier message: 19/04/2006, 18h14
  5. Réponses: 3
    Dernier message: 12/09/2005, 20h27

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