Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt - windows - délai apparition check sur checkbox

Sujet résolu
    18 mars 2018 à 19:03:57

    Bonjour,

    Utilisant Qt Creator, j'ai remarqué que sous windows (uniquement), lors du clic sur une checkbox, celle-ci n'apparaît pas cochée avant la fin de la commande appelée :

    void MainWindow::on_mycheckbox_clicked() {
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }

    --> Lors du clic, il faut attendre 1 seconde avant de voir la checkbox coché (en attendant, elle est légèrement en surbrillance)

    Ce qui est particulièrement flagrant, c'est qu'avec ce code :

    void MainWindow::on_mycheckbox_clicked() {
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        ui->mycheckbox->setChecked(false);
    }

    la checkbox n'apparait jamais cochée. Sous linux, je n'avais pas ce problème et elle apparait coché pendant 1 seconde.

    J'ai essayé de mettre à jour l'ui avec un QCoreApplication::processEvents(); mais ça ne change rien

    Ce n'est pas grand chose, mais je trouve que la "surbrillance" pendant l’exécution du code lié au clic ne se voit pas, donc je voudrais voir apparaitre directement ma case coché. C'est possible ?

    Merci

    -
    Edité par SayanelLyyant1 18 mars 2018 à 19:04:27

    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2018 à 20:49:23

      Salut,

      Oui, mais, en meme temps, si tu met explicitement la valeur de checked à false, comment veux tu que ta checkbox passe au statu checked==true ????

      N'oublie pas que ton signal on_mycheckbox_clicked est géré avant que le signal de mise à jour "général" ne soit émis,  si bien que, si tu force un des états à prendre une valeur particulière (false, dans le cas présent ), c'est cette valeur qui sera prise en compte lors de la mise à jour....

      -
      Edité par koala01 18 mars 2018 à 20:54:53

      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        20 mars 2018 à 9:46:59

        si tu tient vraiment a ce que ta case soit cochée au début, tu n'a cas surcharger l'évenement mouseclick pour faire le changement avec setChecked lors du click de la sourie

        virtual void mousePressEvent(QMouseEvent *event)

        -
        Edité par Zoraneus 20 mars 2018 à 9:50:29

        • Partager sur Facebook
        • Partager sur Twitter
        un projet ? Fait le ou ne le fait pas, il n'y a pas d'essai.
          20 mars 2018 à 11:23:09

          Bonjour !

          Effectivement, cela semble être une bonne solution : je gère moi même ce qui se passe lors du clic.

          Mais comment faire pour surcharger le clic sur ma checkbox ?

          Avec un code comme cela :

          void MainWindow::mousePressEvent(QMouseEvent *event) {
              //Verification du lieu du clic : si clic sur la checkbox, faire la suite.
          ui->mycheckbox->setChecked(true);
          //mon code }

          Un clic n'importe où sur la fenêtre lance le code... sauf sur la checkbox (ou autre bouton) où le mousePressEvent est récupéré par ma checkbox. Je voudrais appeler un QEvent::ignore() sur ma checkbox, mais je ne sais pas comment faire...

          Et de plus, je ne vois pas comment faire là 'vérification du lieu du clic', donc ce n'est surement pas la bonne méthode.

          Comment surcharger uniquement le clic sur cette checkbox seulement ? Dois-je forcement faire une classe héritant de QCheckBox ?

          Merci

          Nb : Je ne sais pas ce qu'il se passe sur ce post, mon précédent message à disparu...

          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2018 à 16:19:22

            Ça fait longtemps que je n'ai plus bossé avec Qt, mais au lieu de t'embêter à récupérer le signal clicked() tu ne pourrais pas récupérer stateChanged(), vérifier l'état de te checkBox et si elle est cochée attendre une seconde avant de la décocher ?

            Et si ta fenêtre est indisponible pendant ces 1 seconde il faudra passer par un QTimer je pense.

            Désolé si j'ai dis une connerie, je me remet petit à petit à Qt mais plutôt du côté QML donc excusez moi si je dis n'importe quoi !

            -
            Edité par zeFresk 20 mars 2018 à 16:20:09

            • Partager sur Facebook
            • Partager sur Twitter
            La flemme vaincra.
              21 mars 2018 à 18:14:32

              Bonjour,

              L'utilisation du stateChanged() (via le slot on_mycheckbox_stateChanged() ) ne résous pas le problème, apparemment l'état (ckecked(bool) ) est changé à l'instant du clic, mais pas affiché en tant que tel tant qu'il y a une exécution en cours...

              • Partager sur Facebook
              • Partager sur Twitter
                21 mars 2018 à 19:12:20

                Et avec un QTimer qui changerai l'état une seconde plus tard de manière asynchrone ?
                • Partager sur Facebook
                • Partager sur Twitter
                La flemme vaincra.
                  22 mars 2018 à 15:14:09

                  Effectivement, c'était la solution ! Merci !

                  Il faut donc faire :

                  void MainWindow::on_mycheckbox_clicked() {
                      QTimer::singleShot(80, this, SLOT(longcode()));
                  }
                  

                  et

                  void MainWindow::longcode() {
                      //code long à executer, par exemple :
                      std::this_thread::sleep_for(std::chrono::milliseconds(1000));
                      //signal indiquant 'terminé'
                  }
                  

                  La checkbox apparait coché, et le code s'effectue en arrière-plan !

                  On notera juste qu'il faut mettre un délai sur le singleshot (80ms ou 100ms), sinon l'état 'coché' n'apparait pas (il n'en a pas le temps ?)


                  • Partager sur Facebook
                  • Partager sur Twitter

                  Qt - windows - délai apparition check sur checkbox

                  × 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