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 :

Opérations avec un cercle et des événements

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Par défaut Opérations avec un cercle et des événements
    Bonjour,

    Je viens vers vous afin de vous demander un petit peu d'aide car je bloque complétement sur ce que je veux faire sur Qt, malgré que je fouille google et divers forums avec pleins d'onglets ouverts en même temps afin de trouver une solution à mes petits problèmes. Je vais donc vous expliquer brièvement ce que je programme: je suis en train de réaliser ou plutôt en train de reproduire l'algorithme snake qui via la création d'un contour initial autour d'un objet désiré sur une image permet d'en obtenir le contour exact à la fin de l'exécution du programme. J'ai au début travaillé sur MicrosoftVisualStudio afin de voir si l'algorithme marchait correctement, et suite à ça, j'ai décidé de basculer sur Qt pour réaliser mon interface graphique car j'ai beaucoup plus d'aisance à code via Qt et pour tout ce qui est rendu graphique de ce type, c'est très puissant et efficace.

    Mon problème actuellement, c'est qu'au début je réalisais une lecture de données d'un fichier.dat pré-crée dans mon dossier qui correspond au contour (ici, c'est un cercle). Et j'aimerai que l'utilisateur puisse créer ce cercle par lui même (centre, rayon), et que les valeurs des points du cercle soient écrites dans un fichier.dat que je peux lire ensuite.

    Afin de créer mon cercle, je dois commencer par créer le centre du cercle à l'aide d'un point et en m'aidant de QMouseEvent avec mousePressEvent sur un GraphicsScene. Alors oui de ce que j'ai vu je pourrai utiliser QGraphicsMouseEvent, cependant j'ai crée tous mes widgets, mes scenes et view dans un MainWindow, du coup la modification du parent posera plusieurs problèmes, et que je souhaite présenter mon interface ainsi:Nom : Sans titre.png
Affichages : 167
Taille : 128,4 Ko

    Ensuite pour créer le rayon, il me semble que je dois utiliser mouseMoveEvent, et enfin pour faire le cercle, avec mouseReleaseEvent.

    Une partie de code que j'ai essayé de réaliser est la suivante pour la création du centre du cercle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void MainWindow::mousePressEvent( QMouseEvent* event ) {
     
     
        if (event->button() == Qt::LeftButton )
        {xDebut=event->x();
            yDebut=event->y();
    scene1.addEllipse(xDebut,yDebut,1,1, QPen(Qt::red));}
     
    }
    Cependant, lorsque je clique sur la scene1 de gauche, l'affichage rendu du point ne correspond pas du tout à l'endroit où j'ai cliqué, c'est décalé.

    L'idéal serait l'idée suivante: sur l'interface que j'ai inséré en image plus haut, on peut voir un bouton "Start contour". J'aimerai avoir la possibilité de créer un point qui soit le centre de l'image dès que je clique sur ce bouton, puis grâce à un MouseEvent, dès que j'ai cliqué sur ce bouton, si j'effectue un clic gauche n'importe où ailleurs sur la scene, que ça corresponde à un point de la circonférence, et après je peux normalement récupérer les données de plusieurs points de ce cercle.

    Merci d'avance pour votre aide que vous pourrez m'apporter.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Pour avoir le clic exactement à la bonne position sur l'image, il faut surchargé la fonction mousePressEvent() du widget affichant l'image. Si vous le faites pour le widget parent, alors il y a un décalage car l'origine du parent n'est pas la même origine que celle de l'image.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Pour avoir le clic exactement à la bonne position sur l'image, il faut surchargé la fonction mousePressEvent() du widget affichant l'image. Si vous le faites pour le widget parent, alors il y a un décalage car l'origine du parent n'est pas la même origine que celle de l'image.
    Bonjour,

    Merci d'avoir répondu. Surcharger la fonction mousePressEvent()? Comment ça marche, je n'ai jamais effectué ça et je n'en comprends pas le sens, pour ne pas avoir rencontré un cas de "surcharge".


    J'aurai aussi une autre question, car là j'ai beau m'acharner, je n'y arrive pas en essayant et modifiant tout à chaque fois. C'est à propos d'un QGraphicsEllipseItem que je crée et dessine dans un QGraphicsScene. J'essaye de le supprimer via removeItem() mais rien à faire, il n'est pas supprimé et je ne comprends pas pourquoi surtout, sachant que j'effectue cette même opération avec des images et que ça marche. Je montre les parties essentielles qui pourraient causer le problème:


    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
    void MainWindow::displayResult()
    {
    //Ce qui ne marche pas, le remove de l'ellipse
       scene2.removeItem(ellipse);  
     
     
    // item2 correspond à une image qui s'ajoute bien avec addItem plus bas, et qui se supprime bien avant
        scene2.removeItem(&item2);
        scene2.addItem(&item2);
        scene2.setSceneRect(scene2.itemsBoundingRect());
     
        // Reading res.dat file and plot the contour
        int m;
        std::ifstream ifs2("final_contour.dat");
        ifs2 >> m;
        std::cout << m;
     
        while (ifs2 >> px)
        {
            ifs2 >> py;
            points.append(QPointF(py,px));
        }
     
        foreach(point, points)
    //Passant par un QGraphicsEllipseItem en header définit ainsi: QGraphicsEllipseItem *ellipse;
        ellipse = scene2.addEllipse(QRectF(point.y(), width-point.x(),1,1),QPen(Qt::red));
     
    // Ajout bête et simple de l'ellipse, mais du coup il n'est pas possible de détruire l'item vu qu'il n'est stocké dans aucune variable de type QGraphicsItem
        //scene2.addEllipse(point.y(), width-point.x(), 1, 1, QPen(Qt::red));
     
    // Moyen de définir l'ellipse en déclarant dans le header: QGraphicsEllipseItem ellipse;
       // ellipse.setRect(0,0,1,1);
       // ellipse.setPos(point.y(), width-point.x());
       // scene2.addItem(&ellipse);
     
        // Saving the final contour into a picture
        QImage pixmap(width, width, QImage::Format_ARGB32_Premultiplied);
        painter.begin(&pixmap);
        painter.setRenderHint(QPainter::Antialiasing, false);
        scene2.render(&painter);
        painter.end();
        pixmap.save("finalcontour.bmp", "BMP");
     
    }

    J'ai tout essayé de faire pour supprimer l'item de type ellipse: passer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qDeleteAll(scene2.items() );
    ou encore et pour ce qui est de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scene2.removeItem(ellipse);
    les 3 façons que j'ai pu trouver de supprimer un item me font crasher, et j'ai une erreur du type
    "QGraphicsScene::removeItem: item 0x4261b0's scene (0x0) is different from this scene (0x4261c8)". Pourtant, il y a un moment où le code ne crash pas pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scene2.removeItem(ellipse);
    , c'est lorsque je place ce dernier dans une autre fonction connectée à un bouton, mais là, ça ne me supprime pas l'item.

    Je charge une image toujours avec mon code, je choisis les paramètres que je désire, je lance l'algorithme (Bouton run snakes) et j'affiche les résultats avec le bouton display snakes, ce bouton qui m'affiche l'image et le nuage de points (à l'aide du QGraphicsEllipseItem) sur l'image.
    Nom : 1437667030-tes.png
Affichages : 130
Taille : 108,7 Ko

    Si je veux modifier les paramètres, relancer l'algorithme, et afficher des résultats différents, la scene va me garder l'ancien nuage de points qui avait été tracé, et me tracer le nouveau nuage de points suite à la modification des paramètres.
    Nom : 1437667194-tes2.png
Affichages : 130
Taille : 111,5 Ko

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    150
    Par défaut
    Merci d'avoir répondu. Surcharger la fonction mousePressEvent()? Comment ça marche, je n'ai jamais effectué ça et je n'en comprends pas le sens, pour ne pas avoir rencontré un cas de "surcharge".
    Ça veut dire redéfinir la fonction, dans une classe fille.
    Vous aviez déjà surcharger mousePressEvent() dans votre classe MainWindow, donc, si vous l'avez déjà effectué.

    Sinon, si cela ne correspond à rien pour vous, je vous conseillerai de lire un cours de C++, car on ne fait pas de Qt sans C++.

    les 3 façons que j'ai pu trouver de supprimer un item me font crasher, et j'ai une erreur du type
    "QGraphicsScene::removeItem: item 0x4261b0's scene (0x0) is different from this scene (0x4261c8)". Pourtant, il y a un moment où le code ne crash pas pour
    Utilisez le débogueur pour comprendre pourquoi vous avez un pointeur NULL (semble t-il).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 8
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Ça veut dire redéfinir la fonction, dans une classe fille.
    Vous aviez déjà surcharger mousePressEvent() dans votre classe MainWindow, donc, si vous l'avez déjà effectué.

    Sinon, si cela ne correspond à rien pour vous, je vous conseillerai de lire un cours de C++, car on ne fait pas de Qt sans C++.
    D'accord, je vois à quoi ça correspond, je vais modifier ça en conséquence du coup.

    Citation Envoyé par LittleWhite Voir le message
    Utilisez le débogueur pour comprendre pourquoi vous avez un pointeur NULL (semble t-il).
    En revanche, pour ce qui est de ça, ce n'était pas une erreur que je mettais en avant, mais ce qui s'affichait dans le QIOdevice. Car le problème, afin que je puisse supprimer mon ellipse, il faudrait que je puisse stocker celle-ci dans une variable en utilisant du coup cette méthode pour la définir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QGraphicsEllipseItem ellipse; // A définir soit dans le header en privé, soit ici.
     
    ellipse.setRect(point.y(), width-point.x(), 1, 1);
    ellipse.setPen(QPen(Qt::red));
    scene2.addItem(&ellipse);
    Car si je fais ainsi, je peux utiliser la fonction removeItem(); sans problème. L'inconvénient est que cette méthode ne me crée qu'un seul point au lieu d'un nuage de points qui s'affiche très bien avec cette manière de définir l'ellipse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QGraphicsEllipseItem *ellipse; // A définir soit dans le header en privé, soit ici.
     
    ellipse = scene2.addEllipse(point.y(), width-point.x(),1,1,QPen(Qt::red));
    Et cette méthode, pour supprimer l'ellipse avec removeItem(); ne marche pas du tout. Et l'autre ne me crée qu'un seul point.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    150
    Par défaut
    Cette méthode pourrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QGraphicsEllipseItem ellipse; // A définir soit dans le header en privé, soit ici.
     
    ellipse.setRect(point.y(), width-point.x(), 1, 1);
    ellipse.setPen(QPen(Qt::red));
    scene2.addItem(&ellipse);
    Il suffit de stocker la variable, dans un tableau, dans le header en privé.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. [WB18] Table avec colonne image : enchaînement des événements
    Par Picol dans le forum WebDev
    Réponses: 0
    Dernier message: 29/05/2013, 12h42
  2. Réponses: 1
    Dernier message: 07/05/2007, 20h12
  3. Problème avec la gestion des événements
    Par Franck.H dans le forum SDL
    Réponses: 32
    Dernier message: 26/02/2007, 16h01
  4. Soucis avec des évènements
    Par kurul1 dans le forum C++Builder
    Réponses: 4
    Dernier message: 18/10/2006, 11h39
  5. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 10h07

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