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 :

Comportement étrange de QApplication


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut Comportement étrange de QApplication
    Bonjour à tous

    J'essaie de transférer la création de l'objet QApplication hors de main() mais j'obtiens des erreurs d'execution que je ne comprends pas.

    Voici les différentes versions testées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <QtGui>
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        QMainWindow* w = new QMainWindow();
        w->show();
        return app.exec();
    }
    Pas de problème, c'est la version "par défaut"

    Maintenant, je transfère la création de QApplication dans un objet :
    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
    #include <QtGui>
     
    class Engine
    {
    public:
        Engine(int argc, char *argv[])
        {
            new QApplication(argc, argv);
        }
     
        int exec()
        {
            return QApplication::exec();
        }
    };
     
    int main(int argc, char *argv[])
    {
        Engine engine(argc, argv);
        QMainWindow* w = new QMainWindow();
        w->show(); // 
        return engine.exec();
    }
    Là, ça plante (d'après le debugeur, un "Segmentation fault" sur QWidget::show)

    Si je transfère la création de la fenêtre dans le constructeur, ça fonctionne à nouveau :
    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
    #include <QtGui>
     
    class Engine
    {
    public:
        Engine(int argc, char *argv[])
        {
            new QApplication(argc, argv);
            QMainWindow* w = new QMainWindow();
            w->show();
        }
     
        int exec()
        {
            return QApplication::exec();
        }
    };
     
    int main(int argc, char *argv[])
    {
        Engine engine(argc, argv);
        return engine.exec();
    }
    Si ensuite, je crée une fonction spécifique pour créer la fenêtre... ça plante :
    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
    #include <QtGui>
     
    class Engine
    {
    public:
        Engine(int argc, char *argv[])
        {
            new QApplication(argc, argv);
        }
     
        void show()
        {
            QMainWindow* w = new QMainWindow();
            w->show();
        }
     
        int exec()
        {
            return QApplication::exec();
        }
    };
     
    int main(int argc, char *argv[])
    {
        Engine engine(argc, argv);
        engine.show();
        return engine.exec();
    }
    Le debugeur me donne un "Segmentation fault" sur QCoreApplication::exec()


    Quelqu'un aurait une explication et une solution pour implémenter la dernière version ?

    EDIT : suite à une remarque de Johnlamericain : le code fonctionne sous windows mais pas sous linux

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    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 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Je n'ai pas la solution. Un moment, j'ai pensé aux constructeurs appelés implicitement ... mais cela n'est pas la cas (vu l'utilisation des pointeurs).

    Par contre ... cela me tuerai que une méthode show alloue de la mémoire. Pourquoi ne pas m'être la construction de QMainWindow() dans le constructeur de Engine ? (et de garder le show dans le Engine.show()) (je sens que je vais me faire taper pour cette remarque).
    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 confirmé

    Inscrit en
    Décembre 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 171
    Par défaut
    J'ai essayé tes codes qui plantent, ils marchent sans soucis pour moi. Je suis sous Ubuntu 10.10 et Qt 4.7.1 et gcc 4.4.5.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Dans les deux cas que tu présentes, que deviens le QMainWindow alloué dynamiquement ?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Je me souviens m'être fait avoir aussi par cette particularité de QApplication.
    En fait le argc passé au constructeur de QApplication doit être une référence au argc du main() et non pas à une variable locale ou paramètre temporairement en pile.
    A noter que la signature est QApplication(int&, char**) et non pas QApplication(int,char**)
    Vraisemblablement QApplication garde cette référence à argc pour l'utiliser plus tard, d'où le plantage si on lui passe un emplacement temporaire.

    Autrement dit, essaye plutôt comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Engine(int& argc, char *argv[])
        {
            new QApplication(argc, argv);
        }

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Ha oui tien c'est bizarre leurs truc
    J'ai regardé le code et je n'ai pas compris l’intérêt de ne pas copier la valeur. C'est comme si argv et argc pourrais être modifier en cours d'exécution.
    Bravo estofilo

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

Discussions similaires

  1. [Forms6i] Un IF-ELSIF au comportement étrange
    Par lafouine dans le forum Forms
    Réponses: 11
    Dernier message: 13/09/2005, 15h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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