Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un changement de classes avec Qt

    11 mars 2008 à 16:25:44

    Salut, je suis entrain d'essayer de créer un programme avec Qt qui offre tojours à l'utilisateur la possibilité d'afficher un message ou de quitter le programme.
    Le problème est que, lorsque le signal de l'utilisateur est enregistrer, le programme doit ouvrir une nouvelle fenêtre et afficher un autre message mais je n'arrive pas à passer d'une classe à l'autre car j'utilise une classe par Widget.
    J'ai d'abord pensé à l'instrcution "goto" même si elle est déconseillée mais cette solution ne marche pas.
    Comment puis-je faire pour passer d'une classe à l'autre ?
    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
      11 mars 2008 à 16:44:59

      ECM? Code? parceque c'est très vague comme explication
      • Partager sur Facebook
      • Partager sur Twitter
        11 mars 2008 à 17:23:33

        Le code n'est pas très différent de celui-du tutoriel :
        MaFenetre.h :
        1. #ifndef DEF_MAFENETRE
        2. #define DEF_MAFENETRE
        3. #include <QApplication>
        4. #include <QWidget>
        5. #include <QPushButton>
        6. #include <QMessageBox>
        7. class MaFenetre : public QWidget
        8. {
        9.     Q_OBJECT
        10.     public:
        11.     MaFenetre();
        12.     private:
        13.     QPushButton *m_boutonDialogue;
        14. };
        15. class Fenetre : public QWidget
        16. {
        17.    Q_OBJECT
        18.    public :
        19.    Fenetre();
        20.    public slots:
        21.    void ouvrirDialogue();  
        22.    private :
        23.    QPushButton *quit;
        24. };
        25. #endif

        MaFenetre.cpp
        1. #include "MaFenetre.h"
        2. MaFenetre::MaFenetre() : QWidget()
        3. {
        4.    setFixedSize(230, 120);
        5.    bool ok=true;
        6.    QString pseudo;
        7.    pseudo = QInputDialog::getText(this,"Pseudo", "Quel est votre pseudo ?");
        8.    if (ok && !pseudo.isEmpty())
        9.    {
        10.      QMessageBox::information(this,"Pseudo","Bienvenue " +pseudo);
        11.    }
        12.    else
        13.    {
        14.      QMessageBox::critical(this, "Pesudo", "Vous n avez rien entre...");
        15.         }}
        16. Fenetre::Fenetre() : QWidget()
        17. {
        18.   setFixedSize(230,120);
        19.   quit=new QPushButton ("Quitter",this);
        20.   QObject::connect(quit,SIGNAL(clicked()), qApp, SLOT(quit()));
        21. }

        main.cpp:
        1. #include <QTranslator>
        2. #include <QLocale>
        3. #include <QInputDialog>
        4. #include <QLibraryInfo>
        5. #include <QApplication>
        6. #include "MaFenetre.cpp"
        7. int main(int argc, char *argv[])
        8. {
        9.     QApplication app(argc, argv);
        10.     QString locale = QLocale::system().name();
        11.     QTranslator translator;
        12.     translator.load(QString("qt_")+locale,QLibraryInfo::location(QLibraryInfo::TranslationsPath));
        13.     app.installTranslator(&translator);    
        14.     MaFenetre fenetre;
        15.     fenetre.show();
        16.     return app.exec();
        17. }
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          11 mars 2008 à 17:31:53

          Mais c'est illisible! Comment tu fais?? o_O

          ok n'est pas utilisé dans QInputDialog::getText, déjà.
          Ensuite ces goto ne servent à rien...

          Pourquoi utiliser goto alors qu'il existe des connect? Ou encore simplement crée une "Fenetre". Même pas besoin de ouvrirDialogue.

          Désolé, mais je comprends pas du tout ce que tu fais... :(
          • Partager sur Facebook
          • Partager sur Twitter
            11 mars 2008 à 17:51:04

            Désolé, j'avais envoyé la mauvaise version de mon code mais j'ai édité.
            • Partager sur Facebook
            • Partager sur Twitter
              12 mars 2008 à 17:54:44

              UP.
              Comment passer d'uns classe à une autre sans utiliser "goto" svp ?
              Merci.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                12 mars 2008 à 18:02:16

                Ce que tu peux faire c'est avoir un slot qui va construire une fenêtre "bêtement".

                ex :
                1. void monSlot(void)
                2. {
                3.     new Fenetre(...);
                4. }


                Et si tu dois appliquer des modif' après sa construction donne lui un nom. Tu peux même avoir un attribut non construit dans le constructeur de ta classe et que tu construit que dans le slot.

                ex :
                1. class C : /* ... */
                2. {
                3.     public :
                4.         C(void) { /* pas de 'myWindow = new Fenetre(...);' */ }
                5.     public slots :
                6.         void monSlot(void);
                7.     private :
                8.         Fenetre *myWindow;
                9. };
                10. void monSlot(void)
                11. {
                12.     myWindow = new Fenetre(...);
                13. }
                • Partager sur Facebook
                • Partager sur Twitter
                  12 mars 2008 à 18:34:55

                  En fait, je suis partit sur une fausse piste :
                  Comment afficher un bouton qui peut envoyer un signal dans la fenêtre qui affiche le contenu du champ ?
                  Merci.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    12 mars 2008 à 19:08:53

                    Quel champ?
                    QMessageBox::information ne suffit pas? (cf tuto m@teo21)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mars 2008 à 19:41:15

                      Si mais je me suis mal exprimé :
                      Je voudrais que la fenêtre dans laquelle est affichée le contenu entré dans le champ affiche 2 boutons quel que soit le résultat qui proposent de retaper une valeur ou de quitter le programme.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        12 mars 2008 à 19:45:42

                        Donc tu as une classe Fenêtre qui possède trois attributs (1 * QLineEdit et 2 * QPushButton). Quand le bouton "ok" (peu importe son nom) est pressé tu voudrais faire quoi?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 mars 2008 à 20:48:00

                          En fait, je voudrais que la fenêtre montrant la saisie du champ affiche le mot saisie dans le champ et 2 boutons (1 pour quitter et 1 pour proposer de retaper un mot dans le champ pour le ré-afficher avec les boutons...).
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            14 mars 2008 à 21:06:59

                            Désolé, mais je comprends pas trop... P-ê qu'avec un petit dessin...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 mars 2008 à 12:19:32

                              Un schéma de ce que je veux faire :

                              Un champ avec du teste à entrer dans une fenêtre * -> affichage du texte dans une autre fenêtre avec 2 boutons
                              ->Un bouton pour revenir à *
                              ->Un bouton pour quitter le programme
                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 mars 2008 à 8:20:12

                                Personne ne veut m'aider :( ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  19 mars 2008 à 10:39:20

                                  Désolé, mais je ne _p_eux pas t'aider. Je le voudrais bien, mais j'en suis incapable. La seul chose que je peux te dire c'est : http://www.siteduzero.com/forum-83-251150-2273638-un-changement-de-classes-avec-qt.html#r2273638 mais...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 mars 2008 à 12:35:00

                                    Voici comment je l'aurai codé :

                                    main.cpp :
                                    1. #include <QApplication>
                                    2. #include "mywidget.h"
                                    3. int main (int argc, char * argv[]) {
                                    4.     QApplication app(argc,argv);
                                    5.         MyWidget widget;
                                    6.         widget.show();
                                    7.     return app.exec();
                                    8. }


                                    mywidget.h :
                                    1. #ifndef MYWIDGET_H
                                    2. #define MYWIDGET_H
                                    3. #include <QWidget>
                                    4. class QLineEdit;
                                    5. class MyWidget : public QWidget {
                                    6.         Q_OBJECT
                                    7. public:
                                    8.         MyWidget(QWidget *parent=NULL);
                                    9. public slots:
                                    10.         void OpenWindow();
                                    11. private:
                                    12.         QLineEdit *text;
                                    13. };
                                    14. #endif


                                    mywidget.cpp :
                                    1. #include <QLineEdit>
                                    2. #include <QLabel>
                                    3. #include <QHBoxLayout>
                                    4. #include <QPushButton>
                                    5. #include "mywidget.h"
                                    6. #include "fenetre.h"
                                    7. MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
                                    8.         QLabel *label = new QLabel(tr("Entrez un texte"));
                                    9.         text = new QLineEdit;
                                    10.         QPushButton *ok = new QPushButton(tr("OK"));
                                    11.         QHBoxLayout *layout = new QHBoxLayout;
                                    12.         layout->addWidget(label);
                                    13.         layout->addWidget(text);
                                    14.         layout->addWidget(ok);
                                    15.         setLayout(layout);
                                    16.         connect(ok,SIGNAL(clicked()),this,SLOT(OpenWindow()));
                                    17. };
                                    18. void MyWidget::OpenWindow() {
                                    19.         Fenetre *fenetre = new Fenetre(text->text());
                                    20.         fenetre->show();
                                    21. }


                                    fenetre.h :
                                    1. #ifndef FENETRE_H
                                    2. #define FENETRE_H
                                    3. #include <QWidget>
                                    4. class Fenetre : public QWidget {
                                    5. public:
                                    6.         Fenetre(QString toDisplay, QWidget *parent=NULL);
                                    7. };
                                    8. #endif


                                    fenetre.cpp :
                                    1. #include <QLineEdit>
                                    2. #include <QLabel>
                                    3. #include <QHBoxLayout>
                                    4. #include <QVBoxLayout>
                                    5. #include <QPushButton>
                                    6. #include <QApplication>
                                    7. #include "fenetre.h"
                                    8. Fenetre::Fenetre(QString toDisplay, QWidget *parent) : QWidget(parent) {
                                    9.         QLabel *textDisplayer = new QLabel(toDisplay);
                                    10.         QPushButton *previous = new QPushButton(tr("Previous"));
                                    11.         QPushButton *quit = new QPushButton(tr("Quit"));
                                    12.         QHBoxLayout *hLayout = new QHBoxLayout;
                                    13.         hLayout->addWidget(previous);
                                    14.         hLayout->addWidget(quit);
                                    15.         QVBoxLayout *vLayout = new QVBoxLayout;
                                    16.         vLayout->addWidget(textDisplayer);
                                    17.         vLayout->addLayout(hLayout);
                                    18.         setLayout(vLayout);
                                    19.         connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));
                                    20.         connect(previous,SIGNAL(clicked()),this,SLOT(close()));
                                    21. };


                                    Et ensuite il reste moc_mywidget.cpp qui sera générer par le Meta Object Compiler.

                                    C'est codé un peu vite fait les noms des variables, etc ne sont pas top. :euh:
                                    Bon courage. ;)

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Un changement de classes avec Qt

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown