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 :

Insérer un item à partir d'une fenêtre de dialogue dans la fenêtre principale [Graphics View]

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Points : 18
    Points
    18
    Par défaut Insérer un item à partir d'une fenêtre de dialogue dans la fenêtre principale
    Bonjour,

    Je viens de débuter sur QT.

    J'utilise un graphicsView dans la classe mainWindow (fenêtre principale).

    Je veux accéder à ce graphicsView à partir d'une autre classe (dialog) pour insérer un élément.

    Le problème est que ui est privé et on peut pas y accéder.
    Pourriez-vous m'aider s'il vous plait.

    Merci!

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    Pour cela, il vous suffit de fournir des accesseurs. Par exemple, avec une classe MainWindow qui lance une instance de Dialog au clic sur un bouton :

    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
    class MainWindow; // Nécessaire, sinon il y aura un problème d'inter-dépendances entre Dialog et MainWindow vu que l'un nécessite l'autre et l'autre nécessite l'un
     
    class Dialog : public QDialog
    {
    public:
        Dialog(MainWindow *parent) // On récupère en paramètre le MainWindow
        {
            _mainWindow = parent;
            QGraphicsView *view = _mainWindow->getView(); // Récupération de la GraphicsView
            // On fait ce qu'on veut avec la GraphicsView
        }
     
    private:
        MainWindow *_mainWindow ;
    }
     
    class MainWindow : public QMainWindow
    {
    public:
        MainWindow()
        {
            QPushButton *btn = new QPushButton("Cliquez ici !");
            setCentralWidget(btn);
            connect(btn, SIGNAL(clicked()), this, SLOT(openDialog())); // Quand on clique sur le bouton, cela appelle openDialog
        }
     
        QGraphicsView *getView() const
        {
            return ui->graphicsView; // Accesseur, retourne la graphicsView
        }
     
    private slots:
        void openDialog()
        {
            Dialog *d = new Dialog(this); // Ouverture de la popup en lui passant this, la MainWindow
            d->exec(); // Ouverture de la popup
            d->deleteLater(); // Une fois que l'on sort d'exec(), c'est que la popup a été fermée, donc on peut libérer la mémoire
        }
    };
    On pourrait également tout simplement passer dans le constructeur de Dialog le QGraphicsView et non la MainWindow.

    N'hésitez pas si vous avez des questions,

    Bonne journée,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Personnellement, je fournirais plutot à la boite de dialogue un pointeur (ou une référence ) vers la vue qui doit être modifiée sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Dialog : public QDialog
    {
    public:
        // ou une classe dérivée perso ?
        Dialog(QGraphicsView * view, QWidget * parent):QDialog(parent), view_(view){}
     
    private:
        QGraphicsView * view_;
    }
    et j'appellerais ce constructeur dans un slot spécifique MainWindow sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void  MainWindow::showDialog(){
        Dialog dial(myView_); // myView est la vue que tu veux transmettre ;)
        /* ... */
    }
    De cette manière, tu n'expose pas un accesseur sur quelque chose qui n'a aucune raison d'être exposé en dehors de la fenêtre principale et, l'un dans l'autre, tu pourra connecter n'importe quel signal (issu de n'importe où dans ton application ) à ce slot
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Points : 18
    Points
    18
    Par défaut re
    Salut ,
    Merci pour vos réponses.

    Mon problème clairement et avec l'utilisation de ui du programme principal.

    J'utilise une classe Dialog comme une classe principale pour créer une fenêtre et dessiner un rectangle et un cercle:
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include "dialog.h"
    #include "ui_dialog.h"
    #include "dialog2.h"
     
    Dialog::Dialog(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Dialog)
    {
           ui->setupUi(this);
           scene = new QGraphicsScene(this);
           ui->graphicsView->setScene(scene);
     
           QBrush greenBrush(Qt::green);
           QBrush blueBrush(Qt::blue);
           QPen outlinePen(Qt::black);
           outlinePen.setWidth(2);
     
           rectangle = scene->addRect(100, 0, 80, 100, outlinePen, blueBrush);
     
           // addEllipse(x,y,w,h,pen,brush)
           ellipse = scene->addEllipse(0, -100, 300, 60, outlinePen, greenBrush);
     
           text = scene->addText("coucou", QFont("Arial", 20) );
           // movable text
           text->setFlag(QGraphicsItem::ItemIsMovable);
           // movable form
           ellipse->setFlag(QGraphicsItem::ItemIsMovable);
           rectangle->setFlag(QGraphicsItem::ItemIsMovable);
    }
     
    Dialog::~Dialog()
    {
        delete ui;
    }
     
    void Dialog::on_pushButton_clicked()
    {
        Dialog2 dialog2;
        dialog2.setModal(true);
        dialog2.exec();
    }
     
    Je génère une autre fenêtre en utilisant une autre classe Dialog2 et je voulais cliquer sur un bouton pour faire la même chose qu'au début sur     scene = new QGraphicsScene(this); et mon code est le suivant: (Dialog2.cpp)
    #include "dialog2.h"
    #include "ui_dialog2.h"
    #include <dialog_derived.h>
     
    Dialog2::Dialog2(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog2)
    {
        ui->setupUi(this);
    }
     
    Dialog2::~Dialog2()
    {
        delete ui;
    }
     
    void Dialog2::on_pushButton_clicked()
    {
    //  J'ai un problème ici
    ui->graphicsView->setScene(this);
     
        QBrush greenBrush(Qt::green);
        QBrush blueBrush(Qt::blue);
        QPen outlinePen(Qt::black);
        outlinePen.setWidth(2);
     
        rectangle = scene->addRect(100, 0, 80, 100, outlinePen, blueBrush);
     
        // addEllipse(x,y,w,h,pen,brush)
        ellipse = scene->addEllipse(0, -100, 300, 60, outlinePen, greenBrush);
     
        text = scene->addText("coucou", QFont("Arial", 20) );
        // movable text
        text->setFlag(QGraphicsItem::ItemIsMovable);
        // movable form
        ellipse->setFlag(QGraphicsItem::ItemIsMovable);
        rectangle->setFlag(QGraphicsItem::ItemIsMovable);
    }
    Merci pour votre réponse!
    Fichiers attachés Fichiers attachés

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 17
    Points : 18
    Points
    18
    Par défaut re
    Bonjour,

    J'ai bien trouvé la solution et je vous remercie pour votre aide.

    En effet, il faut passer scene comme paramètre dans la classe Dialog2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explicit Dialog2(QGraphicsScene *scene, Dialog *parent = 0);
    Cordialement,

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Ceci dit, normalement, tu devrais travailler sur un modèle MVC / MVD (Model View Controler / Model View Delegate), ce qui fait que ta boite de dialogue ne devrait pas attaquer directement la vue / la scène, mais plutot le contrôleur (le délégué) qui permet de modifier le modèle (AKA : tes données métier) en fonction de tes besoins...

    Je m'explique : normalement une vue (qu'elle soit QGraphicsView, QTableView ou n'importe quoi d'autre) a pour seul et unique but de te fournir une représentation "qui te parlera" des données métier que application manipule.

    Pour y arriver, elle utilise un "modèle" qui corresond au "quoi" (ce qu'il faut afficher) et un / des contrôleurs / délégués qui correspond au "comment" (la forme que cela doit prendre).
    Elle correspond en outre avec d'éventuels contrôleurs pour gérer toutes les réactions que l'on peut envisager sur des événements qui surviennent sur la vue.

    Dans certains cas, la vue peut parfaitement se contenter d'appeler le controleur afin de lui faire modifier une valeur (qui fera qu'il affichera une donnée particulière d'une manière différente), dans d'autre, la vue va plutôt lui dire quelque chose comme "il faudrait modifier les données avec telles ou telles données", et le controleur s'occupera alors de vérifier si la modification à apporter est "dans les limites admises" ou non. Si c'est le cas, il modifiera les données métier, sinon, elle enverra à la vue un message qui permettra à l'utilisateur "pourquoi" la modification n'a pas eu lieu (à charge pour la vu de l'afficher).

    D'une certaine manière, ta boite de dialogue n'est "qu'une sorte de vue" qui devrait en théorie s'adresser à un contrôleur particulier pour lui demander d'appliquer des modifications à ta vue
    Du coup, plutôt que de transmettre la vue (ou la scene) à ta boite de dialogue, tu devrais plutôt envisager de permettre à ta boite de dialogue d'émettre différents message qui seraient récupérés différents slots dans ta fenêtre principale qui correspondraient à différentes actions que tu peux entreprendre (et qui s'adresseraient à un / des contrôleurs spécifiques afin de demander soit la mise à jour du contrôleur (si tu veux changer la couleur d'un trait, par exemple) soit la mise à jour des données métier en modifiant une donnée qui aurait pour résultat de déplacer l'information concernée dans la vue, de rajouter une information dans la vue ou au contraire d'en supprimer un ou... va savoir ce que tu peux demander
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/04/2012, 09h28
  2. [CKEditor] insérer du texte à partir d'une source externe à FCKeditor
    Par cbalmefrezol dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 25/04/2008, 09h11
  3. insérer des valeurs à partir d'une boucle automatique
    Par buhrne dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/12/2007, 16h52
  4. Réponses: 5
    Dernier message: 12/12/2006, 16h24
  5. [MySQL] Insérer des données à partir d'une db mysql dans un textarea
    Par minogttao dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/11/2006, 21h59

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