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 :

Fenêtre non modale : ouverture et fermeture

  1. #1
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut Fenêtre non modale : ouverture et fermeture
    Bonjour,

    Avec le code ci-dessous, je peut ouvrir une fenetre 2 en mode non modale avec un pushbutton sur ma fenetre 1.

    1/ Comment faire pour n'avoir qu'une seule fenetre 2, même si on appuie plusieurs fois sur le pushbutton de la fentre 1? (je ne vois pas quel condition je dois mettre)

    2/ Comment faire pour fermer la fenetre 2 a partir d'un autre pushbutton de la fenetre 1?

    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
     
    #include <QtGui>
     
    #include "fen1.h"
    #include "fen2.h"
    #include "ui_fen1.h"
     
    Fen1::Fen1(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Fen1)
    {
        ui->setupUi(this);
        setWindowTitle(tr("1ere Fenetre")); // met titre de la fenetre
        move( ( QApplication::desktop()->width() - width() ) / 2,  ( QApplication::desktop()->height() - height() ) / 2 ); // pour centrer la fenetre sur l'ecran
    }
     
    Fen1::~Fen1()
    {
        delete ui;
    }
     
    void Fen1::on_pushButton_clicked()
    {
        Fen2 *dial = new Fen2(this); // affiche la 2eme fenetre en non modale
        dial->show();
    }
    Cordialement

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu déclares cette fenêtre Fen2 en membre de ta classe Fen1, et les boutons ne font que la "show/hide".

  3. #3
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut Merci
    Merci,

    comment on fait pour pour declarer la fenêtre Fen2 en membre de la classe Fen1?

    Cordialement

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class MaClasse {
    public:
        MaClasse(); // constructeur
        ~MaClasse(); // destructeur
     
    private:
        int membre1;
        QString membre2;
        Fen2* dial;
    };
     
    MaClasse::MaClasse() : dial(new Fen2(this))
    {
    }

    Je vous conseille quand même d'apprendre les bases du C++ (ou de l'objet, je ne sais pas ce qui vous manque) avant d'aller plus loin. Je n'ai pas de cours à vous conseiller sur ce site car je ne les connais pas, mais jetez un œil ici : http://cpp.developpez.com/cours/?page=general#cours-cpp

  5. #5
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut merci
    Je ne fais pas preuve de mauvaise volonté, j'ai lu et relu les tutoriaux diponibles ici et ailleurs sur le c++ et sur qt (pour info, je me debrouillais pas mal en delphi);

    Le probleme c'est qu'ils sont tous orienté sur des resolutions techniques et pas sur les bases pour commencer (a part les operateurs... riens sur les strucures de façons approfondies).

    je suis loin d'être un crack en c++, mais c'est pas cela qui me bloque actuellement.

    C'est bien la logique de fonctionnement de l'edi que l'on utilise (pour moi Qt). l'organisation des trois types de fichiers; les entêtes, les cpp, et les gui (pour la partie graphique).

    j'ai essayer avec tes indications, le code dans Fen1.h, mais sans succes.

    ci joint mon fichier

    Cordialement
    Fichiers attachés Fichiers attachés

  6. #6
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut merci
    Au calme, c'est mieux pour reflechir...Mais pas toujours realisable...

    J'ai compris, je posterais le resultat, mais j'ai encore un souci;

    1/ comment empecher l'ouverture de plusieurs fenetres ?
    2/ si je veux ouvrir plusieurs fenetres comment les refermer de la derniere ouverte a la premiere ?

    Cordialement

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Effectivement à votre post précédent vous n'aviez pas fait ce que je vous avais proposé. Mes remarques concernant les bases concernaient le fait que vous n'aviez pas l'air de comprendre ce que signifie "variable membre de classe", aussi appelé "attribut de classe", ce qui est embêtant si vous voulez de l'aide. Pour un tutoriel "de zéro" je vous avais envoyé un lien par MP A un moment au début du chapitre sur les classes, il est dit :
    Pour commencer, je vous rappelle qu'une classe est constituée :
    • De variables, ici appelées attributs (on parle aussi de variables membres)
    • De fonctions, ici appelées méthodes (on parle aussi de fonctions membres)
    1) Donc là vous voulez empêcher que des fenêtres différentes apparaissent, et non la même fenêtre plusieurs fois. C'est un mécanisme à mettre en place vous-même, il n'y a pas d'astuce à ma connaissance.

    Par exemple, vous pouvez utiliser le polymorphisme vu que vos fenêtres héritent (directement ou non) de QWidget :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Fen1* fenetre1; // new Fen1(this) dans le constructeur
    Fen2* fenetre2; // new Fen2(this) dans le constructeur
    QWidget* fenetreGenerique; // pas de new, pointeur libre
    Ensuite vous ne faites que montrer/cacher fenetreGenerique en faisant au bon endroit fenetreGenerique = fenetre1 ou fenetre2.

    Bon c'est qu'une idée.

    2) Je comprends pas trop cette question, ça me parait bizarre. Je pense que la hiérarchie d'ouverture des fenêtres devrait correspondre à la hiérarchie des objets, ensuite en jouant sur la modalité des fenêtres vous pouvez empêcher de faire n'importe quoi... Encore une fois c'est un casse-tête propre à votre programme, on ne peut pas vous donner une réponse mais juste des idées et des pistes.

  8. #8
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut a suivre...
    Bonjour,

    Voici ce que j'ai compris;

    fen1.h:

    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
     
    #ifndef FEN1_H
    #define FEN1_H
    #include <QMainWindow>
    class Fen2;
    namespace Ui {
        class Fen1;
    }
    class Fen1 : public QMainWindow
    {
        Q_OBJECT
    public:
        explicit Fen1(QWidget *parent = 0);
        ~Fen1();
    private slots:
        void on_pushButton_clicked();
        void on_pushButton_2_clicked();
    private:
        Ui::Fen1 *ui;
        Fen2 *dial;
    };
    #endif // FEN1_H
    fen2.h :

    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
     
    #ifndef FEN2_H
    #define FEN2_H
    #include <QDialog>
    namespace Ui {
        class Fen2;
    }
    class Fen2 : public QDialog
    {
        Q_OBJECT
    public:
        explicit Fen2(QWidget *parent = 0);
        ~Fen2();
    private:
        Ui::Fen2 *ui;
    };
    #endif // FEN2_H
    le main.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <QtGui/QApplication>
    #include "fen1.h"
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Fen1 w;
        w.show();
        return a.exec();
    }
    fen1.cpp :

    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
     
    #include <QtGui>
    #include "fen1.h"
    #include "fen2.h"
    #include "fen3.h"
    #include "ui_fen1.h"
    Fen1::Fen1(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Fen1)
    {
        ui->setupUi(this);
        setWindowTitle(tr("1ere Fenetre")); // met titre de la fenetre
        move( ( QApplication::desktop()->width() - width() ) / 2,  ( QApplication::desktop()->height() - height() ) / 2 ); // pour centrer la fenetre sur l'ecran
    }
    Fen1::~Fen1()
    {
        delete ui;
    }
    void Fen1::on_pushButton_clicked()
    {
        dial = new Fen2(this); // affiche la 2eme fenetre en non modale
        if (dial->isVisible(false)){
        dial->show();
        }
        //ui->pushButton->setEnabled(false);
    }
    void Fen1::on_pushButton_2_clicked()
    {
        dial->hide();
    }
    fen2.cpp :

    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
     
    #include <QtGui>
    #include "fen2.h"
    #include "ui_fen2.h"
    Fen2::Fen2(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Fen2)
    {
        ui->setupUi(this);
        setWindowTitle(tr("Fenetre non modale")); // met titre de la fenetre
    }
    Fen2::~Fen2()
    {
        delete ui;
    }
    Si dans fen1.cpp, j'ecris le code ci-dessous, il ne veut rien savoir, comment puis-je faire ? ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void Fen1::on_pushButton_clicked()
    {
        dial = new Fen2(this); // affiche la 2eme fenetre en non modale
        if (dial->isVisible(false)){
        dial->show();
        }
    }
    Cordialement

  9. #9
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu fais un new chaque clic, tu recrées une fenêtre différente sans effacer la précédente de la mémoire...

    Le new doit être fait qu'une fois, dans le constructeur de Fen1.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fen1::Fen1(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Fen1)
    {
        ui->setupUi(this);
        setWindowTitle(tr("1ere Fenetre")); // met titre de la fenetre
        move( ( QApplication::desktop()->width() - width() ) / 2,  ( QApplication::desktop()->height() - height() ) / 2 ); // pour centrer la fenetre sur l'ecran
        dial = new Fen2(this);
        dial->hide(); // sinon elle sera visible lorsque le parent sera visible - tu peux aussi le mettre dans le constructeur de Fen2 une fois pour toutes.
    }

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Fen1::on_pushButton_clicked()
    {
        dial->show(); // inutile de tester si elle est déjà visible, show() = setVisible(true), ça manipule juste une propriété booléenne
    }

    Je n'ai pas testé mais je crois que c'est ça.

  10. #10
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut merci pou ta patience
    Merci beaucoup à Troudhyl pour son investissement dans tout ce forum.

    => pour repondre a son interrogation, c'est la structure et la "philosophie" du programme qui m'echappe et que je suis en train de comprendre grace a lui.

    Mais je suis quasiement sûr (faites vous connaitres) que mes questions font avancées beaucoup d'autres autodidactes amateurs...

    encore merci et A+

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

Discussions similaires

  1. Fenêtre non modale agissant comme JOptionPane
    Par Baptiste Wicht dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 27/05/2009, 11h57
  2. Fenêtre non modale
    Par ToraTora dans le forum MFC
    Réponses: 8
    Dernier message: 21/05/2008, 18h12
  3. Ouverture d'une fenêtre non modale dans un Thread
    Par Cyrill26 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/02/2008, 17h30
  4. Réponses: 1
    Dernier message: 30/05/2006, 22h54
  5. Réponses: 4
    Dernier message: 13/06/2004, 15h28

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