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 :

Probleme avec un QWidget et show()


Sujet :

Qt

  1. #1
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut Probleme avec un QWidget et show()
    Bonjour,

    Je suis un débutant en C++ et aussi avec le framework QT (oui la totale quoi ^^). Voici mon problème, j'ai une QMainwindow avec un menu et quand je clique sur une entrée de mon menu je voudrais affiché un QWidget perso. Voila comment je m'y prend:

    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
     
    void Notecloud::on_actionSetup_triggered()
    {
        // Afficher un form de configuration
        QWidget config;
     
        QLineEdit *user = new QLineEdit;
        QLineEdit *pwd = new QLineEdit;
        QLineEdit *db = new QLineEdit;
     
        QFormLayout *layout = new QFormLayout;
        layout->addRow("User", user);
        layout->addRow("Password", pwd);
        layout->addRow("DB", db);
     
        config.setLayout(layout);
     
        config.show();
    }
    Ca m'ouvre bel et bien le Qdialog mais il se referme aussitot... Merci de m'aider à comprendre mon erreur.

    Nicolas

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Remplace par
    Je te conseille de regarder la FAQ Qt et particulierement cette Q/R:
    http://qt.developpez.com/faq/?page=qt4Gui#modale
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  3. #3
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Merci de votre réponse,

    J'avais déjà testé mais la compilation me retourne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /home/nico/Projets/desktop/Notecloud/notecloud.cpp:58: erreur: ‘class QWidget’ has no member named ‘exec’
    Je vais reprendre tout doucement la doc et retrouver mes petits, ce sont des notions encore toutes fraiches pour moi

    Merci

  4. #4
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Effectivement QWidget n'a pas de methode exec() comme marqué dans la fac Je crois que comme cela ça devrait fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    config.setWindowModality(Qt::ApplicationModal);
    config.show();
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  5. #5
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Ok, ça compile correctement mais le dialogue s'affiche et disparait en un éclair...

    Nico

  6. #6
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    bsr :
    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
     
     // Afficher un form de configuration
        QWidget config; // quelle est la durée de vie de ce widget ???
     
        QLineEdit *user = new QLineEdit;
        QLineEdit *pwd = new QLineEdit;
        QLineEdit *db = new QLineEdit;
     
        QFormLayout *layout = new QFormLayout;
        layout->addRow("User", user);
        layout->addRow("Password", pwd);
        layout->addRow("DB", db);
     
        config.setLayout(layout);
     
        config.show(); // sa vie se termine ici !! :)
    il faut mettre un pointeur du comme ceci :
    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
     
    QWidget * config; 
     
        QLineEdit *user = new QLineEdit;
        QLineEdit *pwd = new QLineEdit;
        QLineEdit *db = new QLineEdit;
     
        QFormLayout *layout = new QFormLayout;
        layout->addRow("User", user);
        layout->addRow("Password", pwd);
        layout->addRow("DB", db);
     
        config->setLayout(layout);
     
        config->show();
    cordialement
    If you type Google into Google, you Can break the internet" - The IT Crowd

  7. #7
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Pour le coup là ça me ferme tout le programme! Merci de votre aide quand même

  8. #8
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    ah désole, mais essaye ça normalement sa devrait marcher
    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
     
    QWidget * config = new QWidget; // ilfaut initialiser le pointeur
     
        QLineEdit *user = new QLineEdit;
        QLineEdit *pwd = new QLineEdit;
        QLineEdit *db = new QLineEdit;
     
        QFormLayout *layout = new QFormLayout;
        layout->addRow("User", user);
        layout->addRow("Password", pwd);
        layout->addRow("DB", db);
     
        config->setLayout(layout);
     
        config->show();
    essaye sa devrait marcher
    If you type Google into Google, you Can break the internet" - The IT Crowd

  9. #9
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Génial oui en effet en initialisant le pointeur ça marche à la perfection, je retiens la leçon merci d'avoir pris le temps de m'aider c'est super sympa buggen25.

    A plus

    Nicolas

  10. #10
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Citation Envoyé par Hightuxdotnet Voir le message
    Génial oui en effet en initialisant le pointeur ça marche à la perfection, je retiens la leçon merci d'avoir pris le temps de m'aider c'est super sympa buggen25.

    A plus

    Nicolas
    Si tu as mis directement le code de Buggen25 dans ta fonction tu as une fuite mémoire car config n'est jamais détruit.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  11. #11
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Non en effet je n'ai pas recopié de but en blanc le code de Buggen25 et merci de me le préciser pour la fuite de mémoire mais en principe avec un QPushButton *cancelConfig connecté de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget::connect(cancelConfig, SIGNAL(clicked()), config, SLOT(close()));
    Ca devrai me détruire l'allocation mémoire de config non?

    Nicolas

  12. #12
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Citation Envoyé par Hightuxdotnet Voir le message
    Bonjour,

    Non en effet je n'ai pas recopié de but en blanc le code de Buggen25 et merci de me le préciser pour la fuite de mémoire mais en principe avec un QPushButton *cancelConfig connecté de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget::connect(cancelConfig, SIGNAL(clicked()), config, SLOT(close()));
    Ca devrai me détruire l'allocation mémoire de config non?

    Nicolas
    Désolé je ne comprends pas tres bien ce que tu veux dire. Enfin en principe sache que tout new appelle une delete. Donc quand tu fais un new sans delete il y a une fuite memoire. N'oublie pas aussi d'utiliser le systeme parent/enfant de Qt pour que quand tu fais un delete d'un parent cela detruit automatiquement ses enfants.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  13. #13
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Ok oui j'ai lu quelque part ce que tu m'explique au niveau de Qt qui gère automatiquement l'allocation de mémoire des Qwidget enfants, de toute façon j'ai besoin encore de potassé tout ce beau monde avant de pouvoir sortir une application digne de ce nom.

    En tout cas merci de ton aide.

    Nico

  14. #14
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Voila le contenu du header de mon appli notecloud.h

    #ifndef NOTECLOUD_H
    #define NOTECLOUD_H

    #include <QtGui/QMainWindow>

    namespace Ui
    {
    class NotecloudClass;
    }

    class Notecloud : public QMainWindow
    {
    Q_OBJECT

    public:
    Notecloud(QWidget *parent = 0);
    ~Notecloud();

    private:
    Ui::NotecloudClass *ui;

    private slots:
    void on_actionSetup_triggered();
    void on_actionLicense_triggered();
    void on_actionDocumentation_triggered();
    void on_actionAbout_this_app_triggered();
    void on_actionQuit_triggered();
    };

    #endif // NOTECLOUD_H
    Comment rendre mon QWidget config enfant de ma QMainWindow?

    Nicolas

  15. #15
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Citation Envoyé par superjaja Voir le message
    Si tu as mis directement le code de Buggen25 dans ta fonction tu as une fuite mémoire car config n'est jamais détruit.
    Effectivement, il y a une fuite mémoire en utilisant le constructeur QWidget(), en même temps, on peut utiliser le constructeur suivant QWidget ( QWidget * parent = 0, Qt::WindowFlags f = 0 ), pour expliciter l'objet parent de ce widget.
    Cordialement.
    If you type Google into Google, you Can break the internet" - The IT Crowd

  16. #16
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    QWidget * config = new QWidget; // ilfaut initialiser le pointeur

    config->setAttribute(Qt::WA_DeleteOnClose);
    QLineEdit *user = new QLineEdit;
    QLineEdit *pwd = new QLineEdit;
    QLineEdit *db = new QLineEdit;

    QFormLayout *layout = new QFormLayout;
    layout->addRow("User", user);
    layout->addRow("Password", pwd);
    layout->addRow("DB", db);

    config->setLayout(layout);

    config->show();
    Pour faire plus simple, tu peux ajouter la ligne soulignée, qui fera automatiquement un delete de ton widget lors de son close(); Mais de manière générale, il vaut mieux utiliser la parenté entre widgets.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  17. #17
    Membre du Club Avatar de Hightuxdotnet
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Salut Gulish,

    Merci de ta réponse, oui en effet autant laissé géré ça par Qt avec le système parent->enfants ça évite de laissé des fuites lors du développement.

    J'ai repéré un bouquin sur C++ et Qt4, je pense que je vais me l'offrir et l'étudié avant de me lancé dans quoi que ce soit ça m'évitera de faire n'importe quoi

    Merci et bonne après midi.

    Nico

Discussions similaires

  1. [XL-2007] Probleme avec userform show et unload
    Par Pierre67 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/02/2018, 12h53
  2. problem avec netsh interface show interface
    Par midou256 dans le forum Windows 7
    Réponses: 0
    Dernier message: 25/08/2011, 15h50
  3. Probleme avec Show() et Socket
    Par james_kirk dans le forum Windows Forms
    Réponses: 10
    Dernier message: 16/01/2008, 13h31
  4. Problème avec " Show plot Tools"
    Par pouette13 dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 30/07/2007, 12h02
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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