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 :

Rendre une QMainWindow modale


Sujet :

Qt

  1. #1
    Membre actif
    Homme Profil pro
    Etudiant-Benevole pour Electronic-MasterX
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Islande

    Informations professionnelles :
    Activité : Etudiant-Benevole pour Electronic-MasterX
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Par défaut Rendre une QMainWindow modale
    Bien le Bonjour!

    je cherche à rendre ma QmainWindow modal mais malheureusement ça ne fonctionne pas, mon programme plante au debut de l'execution. j'ai debuggé et vu effectivement que l'option setWindowModality que j'ai modifié n'etait pas pris en compte. je vous remercie de me dire ce qui ne va pas.

    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
     
    int main (int argc, char* argv[])
    {
        QApplication app(argc, argv);
     
        QApplication::setStyle(QStyleFactory::create("fusion"));
     
     
        MainWindow fenetre;
     
        fenetre.show();
        switch (fenetre.getUserClass()) {
        case veterinaire:
            VeterinaireInterface veto(fenetre.getUser(), fenetre.getPass());
            auto db = VeterinaireInterface::connected(fenetre.getUser(), fenetre.getPass());
            veto.setDb(db);
            veto.show();
     
            break;
        }
         qApp->setStyleSheet("QLineEdit { background-color: #EFF5FB }");
     
     
        return app.exec();
    }
     
     
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow), m_userClass{UserClass::veterinaire}
    {
        ui->setupUi(this);
        setWindowModality(Qt::ApplicationModal);
    }

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Vite fait bien fait s'il y a un plantage c'est que Ui vaut null et qu'il est mal initialisé ( par new).
    Donc encore une fois mettre des points d'arrêts en déboguant et examiner les variables

  3. #3
    Membre actif
    Homme Profil pro
    Etudiant-Benevole pour Electronic-MasterX
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Islande

    Informations professionnelles :
    Activité : Etudiant-Benevole pour Electronic-MasterX
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Par défaut
    j'ai mis les points d'arret et j'ai examiné les variables, et j'ai constaté que le programme continuait effectivement son execution malgrè le setWindowModality. de ce fait il entre dans le switch et quand il appelle fenetre.getUserClass, ça ne fonctionne pas, vu que je suis censé modifié cette variable seulement quand la fenetre est ouverte

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    oui mais à quoi est rattachée setWindowModality(Qt::ApplicationModal); ?
    Est-ce une fonction membre de QMainWindow ? ( Je suppose que oui)
    je cherche à rendre ma QmainWindow modal mais malheureusement ça ne fonctionne pas, mon programme plante au debut de l'execution. j'ai debuggé et vu effectivement que l'option setWindowModality que j'ai modifié n'etait pas pris en compte. je vous remercie de me dire ce qui ne va pas.
    attention en win32/Windows notamment toutes les fenêtres ne peuvent pas être affichées en "modal".
    Quel OS as-tu ?

  5. #5
    Membre actif
    Homme Profil pro
    Etudiant-Benevole pour Electronic-MasterX
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Islande

    Informations professionnelles :
    Activité : Etudiant-Benevole pour Electronic-MasterX
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Par défaut
    setModality est rattaché à la Mainwindow. on est dans le constructeur de Mainwindow. et si tu fais reference au fait que je devrais placer un this là. je l'ai fait et ça ne joue naturellement aucun role à cet endroit.

    Je suis sous Windows

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Bonjour,

    Je vois deux problèmes dans ce code:

    1. La doc de QWidget::setWindowModality() est pourtant très claire, il est dit "Changing this property while the window is visible has no effect; you must hide() the widget first, then show() it again." Il faut donc appeler cette fonction AVANT d'afficher la fenêtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MainWindow fenetre;
    fenetre.setWindowModality(Qt::ApplicationModal);
    fenetre.show();
    2. L'instance de VeterinaireInterface sera détruite à la sortie du switch, elle ne sera donc jamais affichée, ou alors pendant un court instant. Il faut donc créer un pointeur ou alors déclarer VeterinaireInterface en dehors du switch. Mais dans ce dernier cas, on utilisera de la mémoire pour rien, ce qui n'est pas un drame en sois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    VeterinaireInterface veto(fenetre.getUser(), fenetre.getPass());
    switch (fenetre.getUserClass()) {
        case veterinaire:        
            auto db = VeterinaireInterface::connected(fenetre.getUser(), fenetre.getPass());
            veto.setDb(db);
            veto.show();
     
            break;
        }
    Mais à mon avis, le mieux serait de gérer l'affichage de VeterinaireInterface directement depuis la classe MainWindow, idéalement le main ne devrait servir qu'à afficher la fenêtre principale.

    Pour ce qui est du plantage du programme, cela provient sûrement de l'implémentation de MainWindow, ou VeterinaireInterface, mais sans voir le code, difficile à dire ce qui peut cause cela, mais c'est certainement un pointeur nul ou quelque chose de similaire.

    Et juste pour pinailler, pourquoi nommer "VeterinaireInterface" plutôt que "VeterinaryInterface" et "fenetre" plutôt que "window" ? , désolé mais quand je vois autre chose que de l'anglais dans du code ça me file des boutons. Surtout qu'il est bien plus facile d'obtenir de l'aide sur des forums anglophones (plus grande communauté) et cela facilite les choses si le code est déjà "anglophone". Enfin ce n'est que mon opinion.

  7. #7
    Membre actif
    Homme Profil pro
    Etudiant-Benevole pour Electronic-MasterX
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Islande

    Informations professionnelles :
    Activité : Etudiant-Benevole pour Electronic-MasterX
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Par défaut
    Je ne sais pas si vous me comprenez bien. Je dis bien que je sais effectivement pourquoi mon programme plante, il me renvoit le signal SIGSEGV quand il entre dans le switch. et c'est tout à fait normal qu'il fasse ça! puisque je fais recours à fenetre.getUser() et fenetre.getPass() dans l'appel du constructeur de veterinaireInterface, mais ces deux valeurs ne sont pas iniatilisé puisque ce sont des QLineEdit qui viennent de ma ui et que je dois entrer dynamiquement.

    Le problème est qu'il ne doit meme pas entrer dans le switch tant que ma fenetre modale est ouverte. mais il le fait quand meme.

    le truc est que je pensais qu'en changeant setWindowsModality il bloquerait le programme, et n'executerait plus d'instruction.

    MAIS NON LE PROGRAMME CONTINUE DE D'EXECUTER LES INSTRUCTIONS DU main() MEME QUAND LA FENETRE EST ENCORE OUVERTE


    et c'est ça le principal problème

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Ok, je n'avais pas compris en effet.

    Mais dans ce cas cela n'as rien à voir avec cette l'option "ApplicationModal" qui ne va pas bloquer l'exécution du programme, mais simplement empêcher le focus sur d'autres fenêtres de la même application. Pour bloquer l'exécution il faut lancer une boucle d'événement indépendante.

    Par exemple:

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;    
        w.showModal();
     
        QWidget wi;
        wi.show();
     
        return a.exec();
    }
    mainwindow.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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QEventLoop>
     
    namespace Ui {
    class MainWindow;
    }
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
        void showModal();
     
    protected:
        void closeEvent(QCloseEvent *ce);
     
    private:
        Ui::MainWindow *ui;
        QEventLoop m_el;
    };
     
    #endif // MAINWINDOW_H
    mainwindow.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
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        setWindowModality(Qt::ApplicationModal);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::showModal()
    {
        show();
        m_el.exec();
    }
     
    void MainWindow::closeEvent(QCloseEvent *ce)
    {
        Q_UNUSED(ce)
        m_el.exit();
    }

Discussions similaires

  1. comment rendre une fenetre modal
    Par inter_amine dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/04/2007, 14h06
  2. comment rendre une fenetre modale ?
    Par inter_amine dans le forum Interfaces Graphiques en Java
    Réponses: 12
    Dernier message: 23/03/2007, 11h04
  3. Rendre une JInternalFrame modale
    Par subzero82 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 25/08/2006, 23h15
  4. Rendre une JFrame modale
    Par bugalood dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 03/08/2005, 10h22
  5. Rendre une fenêtre modale non modale
    Par Smortex dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/03/2003, 17h56

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