Question

Cela fait longtemps que je n’utilise pas GTK +, et la dernière fois que j’y suis allé était en C, et non en utilisant gtkmm et C ++ comme je le suis maintenant. Quoi qu’il en soit, j’ai ce qui, à mon avis, devrait être un problème facile à résoudre:

J'ai un menu contextuel composé d'une liste de boutons radio et lorsque je clique sur l'un d'eux, je souhaite qu'une action soit exécutée. Le code va comme ceci:

    Gtk::RadioMenuItem::Group group;
    for ( size_t i = 1; i < LH_MAX; ++i )
    {
        Gtk::RadioMenuItem* pItem = new Gtk::RadioMenuItem( group, names[i], names[i] );
        pItem->set_name( names[i] );
        pItem->signal_activate().connect( sigc::mem_fun(*this, &MyClass::on_item_activated) );
        pItem->show();
        m_Menu.append( *Gtk::manage(pItem) );
    }

Le seul problème que je vois est que MyClass :: on_item_activated est appelé deux fois lorsqu'un bouton radio précédemment non sélectionné est sélectionné dans le menu. Il n'est appelé qu'une seule fois lorsque vous cliquez sur le bouton radio déjà sélectionné.

Je suppose que le premier tir consiste à dire "quelque chose n’est plus activé". et le second concerne l'activation du nouveau bouton radio. Que je me trompe ou pas, la question est la même: quelle est la meilleure façon de faire en sorte que mon gestionnaire agisse une fois par clic? Soit j'ai besoin que le gestionnaire ne soit appelé qu'une seule fois, ou j'ai besoin de quelque chose à vérifier de l'intérieur pour savoir si le rappel est un "duplicata". ou pas.

Était-ce utile?

La solution

Vous pouvez utiliser sigc :: bind pour fournir l'élément en tant qu'argument de la fonction de rappel.

pItem->signal_activate().sigc::bind(sigc::mem_fun(*this,&MyClass::on_item_activated),pItem));

Ensuite, vous pouvez utiliser item- > get_active () dans le rappel pour répondre aux activations uniquement.

      void MyClass::on_item_activated(Gtk::RadioMenuItem* item) {
        if (item->get_active()) {
               // Do some stuff
        }
    }

Autres conseils

C’est ce que je fais aussi, connectez-vous à signal_toggled () et vérifiez si get_active () est vrai.

Je ne sais pas exactement ce que vous essayez d'accomplir (ni MyClass ni les classes de base dont elle hérite), mais la connexion à signal_toggled () pourrait être plus utile que signal_activate ()

/ Je suis d’accord avec Johannes. Vérifiez si l'élément est activé lors de la réception du signal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top