Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment trouver quel Gtk::Entry est utilisé ?

gtkmm-4.0

    4 septembre 2022 à 14:12:43

    Bonjour,

    J'ai migré sur gtkmm-4.0 et je suis sur ubuntu 22.04.

    En créant une fenêtre contenant beaucoup d'entrées (GTk::Entry) je cherche une méthode pour trouver quel widget est utilisé et en récupérer l'entrée.

    Je cherche depuis un moment sur internet une solution et en parcourant la doc https://developer-old.gnome.org/gtkmm-tutorial/stable/index-info.html.en

    je ne trouve pas de solution.

    Pour résumé, je crée les entrées dans un Gtk::Grid et je les ajoute de cette façon

    Gtk::Entry m_case[9][9];
    Gtk::Grid m_grid;
    for (int i{0}; i < 9; i++)
    {
        for (int j{0}; j < 9; j++)
        {
            m_case [i][j].set_text(std::to_string(j));
            m_grid.attach(m_case [i][j], j, i, 1, 1);
        }
    }

    Une idée sur comment procéder ?

    -
    Edité par Duncan4031 4 septembre 2022 à 19:14:53

    • Partager sur Facebook
    • Partager sur Twitter
      4 septembre 2022 à 15:45:59

      Le widget utilisé c'est m_grid non ?

      Je ne suis pas sûr d'avoir compris ce que tu voulais dire, si tu veux récupérer une entrée dans m_grid je crois qu'il y a une fonction de crois qui récupère l'entrée correspondant au chiffre en argument.

      Je regarde s'il y en a une, je vais modif ce message après

      EDIT: la doc' n'est pas du tout complète, je ne sais pas

      -
      Edité par gl-dev 4 septembre 2022 à 15:54:16

      • Partager sur Facebook
      • Partager sur Twitter
        4 septembre 2022 à 16:22:18

        Ah bravo c'est ce que je cherchais
        • Partager sur Facebook
        • Partager sur Twitter
          4 septembre 2022 à 19:05:11

          Merci pour la réponse.

          Il me faut maintenant trouver quel widget a le focus et récupérer le texte.

          Je pensais pouvoir utiliser is_focus() qui  normalement renvoie un bool

          bool Gtk::Widget::is_focus() const

          Determines if the widget is the focus widget within its toplevel. This does not mean that the [property Gtk.Widget:has-focus] property is necessarily set; [property Gtk.Widget:has-focus] will only be set if the toplevel widget additionally has the global input focus.

          Retourne :
          <tt>true</tt> if the widget is the focus widget.

          mais après quelques tests ça me répond toujours faux.

          Pour prendre un exemple voici ce que j'ai fait

          #include "keyboard.h"
          
          KeyBoard::KeyBoard() : m_quit("Close")
          {
            set_title("Gtk::entry event");
            set_default_size(200, 100);
            set_child(m_box);
          
            m_box.set_margin(5);
            m_box.set_orientation(Gtk::Orientation::VERTICAL);
            m_box.append(m_grid);
            m_box.append(m_quit);
          
            m_grid.set_child_visible();
            m_grid.attach(m_entry1, 0, 0, 1, 1);
            m_grid.attach(m_entry2, 1, 0, 1, 1);
          
            m_entry1.set_margin(5);
            m_entry1.set_text("entry 1");
            m_entry2.set_margin(5);
            m_entry2.set_text("entry 2");
          
            m_quit.set_margin(5);
          
            auto enterkey = Gtk::EventControllerKey::create();
            enterkey->set_propagation_phase(Gtk::PropagationPhase::CAPTURE);
            enterkey->signal_key_pressed().connect(sigc::mem_fun(*this, &KeyBoard::enter_key), false);
            add_controller(enterkey);
          
            m_quit.signal_clicked().connect([this]() {on_quit(); });
          
          }
          bool KeyBoard::enter_key(guint keyval, guint, Gdk::ModifierType)
          {
            if (keyval == GDK_KEY_KP_Enter)
            {
              Gtk::Widget *child1 = m_grid.get_child_at(0, 0);
              Gtk::Widget *child2 = m_grid.get_child_at(1, 0);
          
              std::cout << "child1 -> " << std::boolalpha << child1->is_focus() << std::endl;
              std::cout << "child2 -> " << std::boolalpha << child2->is_focus() << std::endl;
              std::cout << "entry1 -> " << std::boolalpha << m_entry1.is_focus() << std::endl;
              std::cout << "entry2 -> " << std::boolalpha << m_entry2.has_focus() << std::endl;
              std::cout << "grid -> " << std::boolalpha << m_grid.is_focus() << std::endl;
              std::cout << "box -> " << std::boolalpha << m_box.is_focus() << std::endl;
              std::cout << "window -> " << std::boolalpha << is_focus() << std::endl;
          
              return true;
            }
            return false;
          }
          
          void KeyBoard::on_quit()
          {
            hide();
          }


          Au test is_focus() j'ai toujours la réponse false, ce qui fait que je n'arrive pas à trouver quel Gtk::Entry est utilisé.

          Une idée ?

          -
          Edité par Duncan4031 4 septembre 2022 à 19:07:36

          • Partager sur Facebook
          • Partager sur Twitter
            5 septembre 2022 à 14:13:49

            Salut,

            Fais attention, il y a une différence entre is_focus et has_focus.  Je ne suis pas sur que ce ne soit pas has_focus qui t'intéresse ici, dans le sens où, ce qui t'intéresse est bel et bien le focus global ;)

            Ceci étant dit, peut-être aurais tu intérêt à maintenir (sous forme de donnée membre de ta grille) en mémoire le widget actuellement sélectionné ainsi que sa position dans la grille, en mettant -- bien sur  -- en place un système permettant de mettre ces informations à jour à chaque fois qu'elles sont modifiées.

            Cela t'éviterait sans doute de devoir passer l'ensemble de ta grille en revue à chaque fois que tu te pose une question sur le widget actuellement sélectionné (ou que tu veux le modifier)  ;)

            • 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
              5 septembre 2022 à 14:51:16

              Entre temps j'ai également testé avec has_focus() mais j'ai toujours false en réponse même si visuellement je vois le focus sur le Entry.

              Le focus doit fonctionner d'une autre manière avec Gtk::Entry mais malheureusement pour le moment je ne trouve rien dans la doc.

              -
              Edité par Duncan4031 5 septembre 2022 à 14:59:37

              • Partager sur Facebook
              • Partager sur Twitter
                5 septembre 2022 à 16:15:49

                N'y aurait il pas quelque chose à faire avec grab_focus lorsque tu sélectionnes ton widget?

                Cela pourrait donner un code proche de (je simplifie au maximum):

                Gtk::Widget *child1 = m_grid.get_child_at(column, row);
                child1->grapb_focus()
                /* ... */
                if(child1->has_focus() ) // Should be true, as explicitely asked ...
                

                On me dit cependant que ca, c'était valable avec la version 3.x de Gtk... je ne sais pas du tout si la fonction est toujours disponible avec la version 4.x :p

                • 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
                  5 septembre 2022 à 18:10:38

                  Effectivement, mais dans ce cas c'est le programme qui donne le focus et pas l'utilisateur et même dans ce cas le retour de 

                  child1->has_focus()

                  est toujours false.

                  Je pense donc que la gestion du focus avec Gtk::Entry est différente des autres widgets mais mal expliqué dans la doc.

                  Par exemple si je focus le bouton Close j'obtiens bien true mais si je focus entry1 ou entry2 j'ai toujours false

                  Pour la doc

                  https://developer-old.gnome.org/gtkmm-tutorial/stable/sec-text-entry.html.en

                  https://developer-old.gnome.org/gtkmm/stable/classGtk_1_1Entry.html

                  -
                  Edité par Duncan4031 5 septembre 2022 à 19:18:50

                  • Partager sur Facebook
                  • Partager sur Twitter

                  comment trouver quel Gtk::Entry est utilisé ?

                  × 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