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 :

Non-affichage d'un bouton sur une fenêtre

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut Non-affichage d'un bouton sur une fenêtre
    Bonjour à tous,

    Je débute en programmation c++ et sur Qt et j'ai du mal à voir mon erreur...
    Je cherche à afficher un bouton "connexion" sur une fenêtre "window1" que je crée.
    Dans cette fenêtre, j'affiche aussi des champs "user" et "mot de passe" semblable à une page de connexion et je souhaiterai être redirigé vers une autre fenêtre lorsque je clique sur le bouton "connexion". Avant cela, j'aimerai tout de même que ce bouton s'affiche ! Les champs user et mot de passe s'affichent bien comme je le souhaite mais pas ce bouton.

    Voici mon .h et mon .cpp :

    window1.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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #ifndef WINDOW1_H
    #define WINDOW1_H
     
     
    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <QLineEdit>
    #include <QFormLayout>
    #include <QVBoxLayout>
    #include "window2.h"
     
     
     
    class window1 : public QWidget
    {
    public:
        window1();
     
    private:
     
        QComboBox *user;
        QLineEdit *mdp;
        QFormLayout *formLayout;
        QVBoxLayout *layoutPrincipal;
        QPushButton *boutonQuitter;
     
     
    };
     
    #endif // WINDOW1_H
    window1.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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include "window1.h"
    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <QLineEdit>
    #include <QFormLayout>
    #include <QVBoxLayout>
    #include "window2.h"
     
    window1::window1() : QWidget()
    {
        setFixedSize(400, 250);
     
     
     
        QWidget fenetre;
        // Création du layout de formulaire et de ses widgets
     
        user = new QComboBox(this);
     
        user->addItem("Choix user");
        user->addItem("User1");
        user->addItem("User2");
        user->addItem("User3");
     
     
        mdp = new QLineEdit(this);
     
        formLayout = new QFormLayout(this);
        formLayout->addRow("&Utilisateur", user);
        formLayout->addRow("&Mot de passe", mdp);
     
       // Création du layout principal de la fenêtre (vertical)
        layoutPrincipal = new QVBoxLayout(this);
        layoutPrincipal->addLayout(formLayout); // Ajout du layout de formulaire
     
        boutonQuitter = new QPushButton("&Connexion", this);
        boutonQuitter->move(110, 50);
     
       // QDialog fenetre2 (this);
     
        QWidget::connect(boutonQuitter, SIGNAL(clicked()),this, SLOT(exec()));
     
        QWidget::connect(boutonQuitter, SIGNAL(clicked()), this, SLOT(quit()));
     
        layoutPrincipal->addWidget(boutonQuitter); // Ajout du bouton
        fenetre.setLayout(layoutPrincipal);
     
    }
    A priori, pas d'erreur de compilation mais un message apparait :

    QLayout: Attempting to add QLayout "" to QWidget "", which already has a layout
    QLayout::addChildLayout: layout "" already has a parent
    QObject::connect: No such slot QWidget::exec() in ..\test\window1.cpp:42
    QObject::connect: No such slot QWidget::quit() in ..\test\window1.cpp:44


    Voila ce qui est affiché lorsque je compile :

    Nom : sortieapp.PNG
Affichages : 227
Taille : 14,9 Ko

    Mais surtout ce que je voudrai faire (je pense que cela peut être utile de vous montrer) :

    Nom : sortieapp2.PNG
Affichages : 222
Taille : 89,2 Ko

    En espérant bénéficier de votre clairvoyance..

    Merci d'avance pour votre temps

    Ps: j'ai suivi un cours sur le c++ et qt sur Open Classroom pour effectuer ce code mais d'après les développeurs d'OC, il est fortement déconseillé de suivre ce cours car il n'est pas du tout complet. Mais ça, je ne l'ai lu qu'après..

  2. #2
    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,

    Il y pas mal d'erreurs dans ce code.

    1) Il ne faut jamais passer de parent à une constructeur de widget ou layout qui sera ensuite utilisé dans une autre layout.

    2) QWidget fenetre; fenetre ne sert à rien, car nous somme déjà dans le constructeur d'un QWidget, inutile de re-créer un autre widget pour contenir notre layout.

    3) Puisque le bouton sera placé dans un layout, mieux vaut supprimer cette ligne: boutonQuitter->move(110, 50);4) QWidget::connect(boutonQuitter, SIGNAL(clicked()), this, SLOT(quit())); et QWidget::connect(boutonQuitter, SIGNAL(clicked()),this, SLOT(exec()));. Il n'existe pas de slot quit() ni exec() dans la classe QWidget (this). Vous devez confondre avec QDialog. Il faudra plutôt connecté un slot qui s'occupera d'afficher la nouvelle fenêtre et de fermer celle-ci.

    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
    window1::window1() : QWidget()
    {
        setFixedSize(400, 250); 
     
        // Création du layout de formulaire et de ses widgets 
        user = new QComboBox;
     
        user->addItem("Choix user");
        user->addItem("User1");
        user->addItem("User2");
        user->addItem("User3");
     
     
        mdp = new QLineEdit;
     
        formLayout = new QFormLayout;
        formLayout->addRow("&Utilisateur", user);
        formLayout->addRow("&Mot de passe", mdp);
     
       // Création du layout principal de la fenêtre (vertical)
        layoutPrincipal = new QVBoxLayout;
        layoutPrincipal->addLayout(formLayout); // Ajout du layout de formulaire
     
        boutonQuitter = new QPushButton("&Connexion"); 
        QObject::connect(boutonQuitter, &QPushButton::clicked, this, &window1::hide);
     
        layoutPrincipal->addWidget(boutonQuitter); // Ajout du bouton
        setLayout(layoutPrincipal);
     
    }
    QDialog serait peut-être plus adapté pour ce genre de fenêtre.

    En ce qui concerne le cours de OPC, je ne vois pas pourquoi il devrait être déconseillé, il date certes un peu, mais il existe bien certaines base de Qt. Il n'est certes pas complet, mais je ne vois pas comment on pourrais faire un cours complet sur Qt, c'est tellement vaste. Je pense que vous devriez relire le chapitre "Positionner ses widgets avec les layouts" afin de bien comprendre la différence entre le positionnement absolu et en layout. Car actuellement il semble que vous mélangiez ces deux méthodes.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut
    En enlevant le [ QWidget fenetre; ], tout s'est éclairci ! En suivant tes conseils, j'obtiens un résultat plus satisfaisant que ce que je désirai. La première fenêtre se ferme à l'appui du boutonQuitter "connexion" (qui, d'ailleurs, s'affiche maintenant !).

    Concernant l'ouverture de la seconde fenêtre, j'ai lu quelques heures après avoir posté mon message que le QDialog serait plus approprié tu as raison. Je vais maintenant orienté ma concentration sur la gestion de ce brave QDialog !

    Je te remercie Gojir4

    Dernière question avant de résoudre ce sujet : Est-ce une bonne idée de partir sur du Qt Designer pour le design des fenêtres plutôt que de tout codé directement dans les différentes classes?

  4. #4
    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
    Citation Envoyé par UncleNas Voir le message
    Dernière question avant de résoudre ce sujet : Est-ce une bonne idée de partir sur du Qt Designer pour le design des fenêtres plutôt que de tout codé directement dans les différentes classes?
    Je dirais que oui. Pour la plupart des interfaces, le designer est largement suffisant et permet de gagner pas mal de temps et de mieux se concentrer sur la partie "algorithmique". Pour débuter je pense que c'est la meilleure option.

    Citation Envoyé par UncleNas Voir le message
    Concernant l'ouverture de la seconde fenêtre, j'ai lu quelques heures après avoir posté mon message que le QDialog serait plus approprié tu as raison. Je vais maintenant orienté ma concentration sur la gestion de ce brave QDialog !
    Voici une solution possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(int argc, char *argv[])
    {
        [..]
        QMainWindow mw;
        Login login;
        if (login.exec() == QDialog::Accepted) {
            mw.show();
        }
        [..]
    }
    source: https://stackoverflow.com/questions/...re-main-window

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut
    Je demandais ça car j'ai commencé à m'initier un peu à Qt Designer et je trouvais vraiment que dans la réalisation de l'interface d'un logiciel (mission à laquelle je suis assigné), Qt Designer était vraiment un outil simple d'utilisation. Le plus complexe reste à venir lorsqu'il faudra intégré tous les éléments crées dans le code ! Mais nous n'y sommes pas encore

    Merci pour ta solution Gojir mais sans le .h et le .cpp de la classe Login, je n'arrive pas encore à visualiser ce que réalise ce code.. je ne suis qu'un nouveau genin en programmation. Même en visitant la source que tu as laissé, ce n'est qu'un amas de pleins de morceaux de codes, je suis totalement hors contexte.. Mais le coeur y est dans les remerciements et je ne veux pas t’embêter plus que ça avec mes lacunes !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/11/2017, 21h54
  2. [X3v6.5] Bouton sur une fenêtre
    Par Invité dans le forum SAGE
    Réponses: 4
    Dernier message: 15/07/2015, 15h10
  3. [PB 9] Affichage d'un bouton sur une ligne d'une datawindow
    Par Dark Ryus dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 23/10/2008, 09h13
  4. Réponses: 8
    Dernier message: 29/08/2006, 10h22
  5. Affichage d'une image sur une fenêtre secondaire.
    Par renorx dans le forum Composants VCL
    Réponses: 3
    Dernier message: 03/01/2006, 19h06

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