Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] QWizardPage + QTextEdit

Empêcher l'activation du bouton "Next"

Sujet résolu
Anonyme
    21 mars 2008 à 12:51:51

    Bonjour.

    Je remercie d'avance ceux qui auront le courage de me lire jusqu'au bout, même s'ils ne peuvent pas répondre. ;)

    J'ai un petit problème avec Qt. Je suis entrain de créer un assistant (QWizard) qui contient plusieurs pages (QWizardPage).
    J'aimerais désactiver le bouton "Next" tant que tous les champs ne sont pas remplis.

    J'ai regardé dans la doc et j'ai trouvé trois méthodes pour arriver à mon but.


    1ère méthode :



    Sur la première page de mon assistant, j'utilise :
    1. myTitle = new QLineEdit;
    2. /// Fields Registration.
    3. this->registerField("title*", myTitle); // The '*' force the user to give the title.
    Et ça fonctionne, car tant que myTitle ne contient rien le bouton "Next" est désactivé. Super! :)

    Mais ça ne fonctionne pas à la deuxième page avec des QTextEdit. :(
    Car quand je fais :
    1. myNews = new QTextEdit;
    2. /// Fields Registration.
    3. this->registerField("news*", myNews);

    Le bouton "Next" n'est jamais réactivé...

    Je suis tombé sur ça : http://www.qtcentre.org/forum/f-qt-programming-2/t-how-to-add-qtextedit-to-qwizard-11640.html
    Il explique qu'il faut procéder comme ça :
    1. this->registerField("news*", myNews, "plainText");

    Mais là encore ça ne fonctionne pas.

    J'ai aussi essayé comme ça :
    1. this->registerField("news*", myNews, "plainText", "textChanged");

    Mais le résultats est le même. :(

    J'ai donc essayé la deuxième méthode bien que j'aurais préféré n'utiliser qu'une seule méthode...


    2e méthode :



    Le principe étant de redéfinir quelques fonctions, j'ai mis en place les nécessaires, fais les connections nécessaires, et toussa, ... Mais là encore ça ne fonctionnait pas.

    1. bool isComplete(void) { return (myNews->plainText().isEmpty()); }
    2. public slots :
    3.         void Changed(void) { emit completeChanged(); }

    1. connect(myNews, SIGNAL(textChanged()), this, SLOT(Changed()));


    Donc je me lance dans la dernière possibilité.

    3e méthode :



    Je rajoute donc quelque ligne de code.
    1. bool validatePage(void);

    1. bool S2::validatePage(void) // S2 c'est le nom de ma classe.
    2. {
    3.     /**
    4.         If all fields are not empty we say "true"!
    5.         Otherwise we print one (or more) information message(s) and say "false".
    6.     **/
    7.     bool ok = true;
    8.     if (myNews->toPlainText().isEmpty())
    9.     {
    10.         QMessageBox::information(this, "Étape 2",
    11.                                  "Le champs des nouvautés n'est pas remplis.");
    12.         ok = false;
    13.     }
    14.     /// Autres tests.
    15.     return ok;
    16. }

    Et cette fois ça fonctionne. :)

    <acronym title="Le zéro qui n'est pas dans ma tête."> o_O</acronym>: je croyais que tu avais un problème. Il est où alors?

    Mon problème est que j'aime comprendre le pourquoi du comment. :p
    J'aimerais comprendre pourquoi les deux premières méthodes ne fonctionnent pas. Surtout la première. Et si possible faire fonctionner la première dans mon programme pour ne pas utiliser 36'000 méthodes différentes.

    Merci aux courageux qui ont tenus le coup à cette lecture. Et un grand merci à ceux qui sauront me répondre. :)
    • Partager sur Facebook
    • Partager sur Twitter
      21 mars 2008 à 15:26:09

      Citation : doc Qt

      Fields are global to the entire wizard and make it easy for any single page to access information stored by another page


      vérifies sur les pages suivantes la valeur de "title*"

      1. this->registerField("news*", myNews, "plainText", "textChanged");

      ceci est faut car le 4ème paramètre est invalide, il faut mettre :
      1. SLOT(textChanged())

      à la place de "textChanged"
      (par contre pour le 3ème je sais pas, tu peux mettre 0 pour tester.

      ps : cet exemple pourra t'aider : http://doc.trolltech.com/4.3/dialogs-classwizard.html
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        22 mars 2008 à 12:43:53

        Tout d'abord, merci d'avoir lu tout ça! :)

        Si je tente d'accéder à "title" comme ça :
        1. myNews = new QTextEdit(wizard()->field("title").toString());

        le programme ne peut pas s'exécuter.

        Citation : compilateur

        Checking for existence: /home/hiura/Bureau/C++/GP/code/bin/GP
        Executing: /home/hiura/Bureau/C++/GP/code/bin/GP (in /home/hiura/Bureau/C++/GP/code/bin/)
        Process terminated with status -1 (0 minutes, 0 seconds)


        J'ai bien testé, si je mets :
        1. myNews = new QTextEdit;

        le programme s'exécute bien comme il faut.

        Pour le 3 et 4e j'ai essayé tout ça :
        1. this->registerField("news*", myNews, "plainText");
        2. this->registerField("news*", myNews);
        3. this->registerField("news*", myNews, "plainText", SLOT(textChanged()));
        4. this->registerField("news*", myNews, "plainText", "SLOT(textChanged())");
        5. this->registerField("news*", myNews, 0, "SLOT(textChanged())");
        6. this->registerField("news*", myNews, 0, SLOT(textChanged()));

        Aucun ne marche. Mais je comprends pas, pourquoi SLOT(...) fonctionnerait? C'est un const char * qui est attendu. SLOT retourne une chaine?

        Je me suis déjà inspiré de l'exemple, mais il n'y a pas de QTextEdit dedans. :(

        Merci de ton aide.
        • Partager sur Facebook
        • Partager sur Twitter
          22 mars 2008 à 15:07:48

          c'est un SIGNAL qu'il attend et non un SLOT ^^

          1. this->registerField("news*", myNews, "plainText", SIGNAL(textChanged()));


          pour l'affaire de const char*, regarde la méthode connect de QObject pour t'en convaincre ^^
          • Partager sur Facebook
          • Partager sur Twitter
          Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
          Anonyme
            22 mars 2008 à 16:28:46

            C'est "magique"! Merci à vous deux. :)

            J'ai réussi à faire fonctionner
            1. myNews = new QTextEdit(wizard()->field("title").toString());

            En fait il faut utiliser field dans initializePage().

            Problème résolu.
            • Partager sur Facebook
            • Partager sur Twitter

            [Qt] QWizardPage + QTextEdit

            × 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