Domanda

È passato un po 'di tempo da quando ho usato GTK +, e l'ultima volta che ho fatto è stato in C, non usando gtkmm e C ++ come sono ora. Comunque, ho quello che penso dovrebbe essere un problema facile da risolvere:

Ho un menu a comparsa costituito da un elenco di pulsanti di opzione e quando faccio clic su uno di essi voglio che avvenga qualche azione. Il codice va così:

    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) );
    }

L'unico problema che vedo è che MyClass :: on_item_activated viene chiamato due volte quando viene scelto un pulsante di opzione precedentemente non selezionato dal menu. Viene chiamato solo una volta quando si fa clic sul pulsante di opzione già selezionato.

Immagino che il primo sparo sia dire "qualcosa non si attiva più," e il secondo è per l'attivazione del nuovo pulsante di opzione. Che io abbia ragione o torto, la domanda è la stessa: come posso fare in modo che il mio gestore possa agire solo una volta per clic? O ho bisogno che il gestore venga chiamato una sola volta, o ho bisogno di qualcosa da controllare al suo interno per sapere se il callback è un "duplicato" o no.

È stato utile?

Soluzione

È possibile utilizzare sigc :: bind per fornire l'elemento come argomento alla funzione di callback.

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

Quindi puoi usare item- > get_active () nel callback per rispondere solo alle attivazioni.

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

Altri suggerimenti

È quello che faccio anche io, connettiti a signal_toggled () e controlla se get_active () è vero.

Non so esattamente cosa stai cercando di realizzare (o cosa sia MyClass e da quali classi di base eredita), ma collegarsi a signal_toggled () potrebbe essere più utile di signal_activate ()

/ Accetto con Johannes. Controlla se l'elemento è attivato quando ricevi il segnale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top