Pregunta

Hace mucho tiempo que no uso GTK +, y la última vez que lo hice fue en C, sin usar gtkmm y C ++ como lo estoy haciendo ahora. De todos modos, tengo lo que creo que debería ser un problema fácil de resolver:

Tengo un menú emergente que consiste en una lista de botones de opción, y cuando hago clic en uno de ellos quiero que ocurra alguna acción. El código es el siguiente:

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

El único problema que veo es que se llama dos veces a MyClass :: on_item_activated cuando se elige un botón de opción no seleccionado previamente del menú. Se llama solo una vez cuando se hace clic en el botón de opción ya seleccionado.

Supongo que el primer disparo es decir que "algo ya no se activa", & "; y el segundo es para la activación del nuevo botón de radio. Si estoy en lo correcto o no, la pregunta es la misma: ¿cuál es la mejor manera de hacer que mi manejador solo actúe una vez por clic? O bien necesito que el manejador sea llamado una sola vez, o necesito algo para verificar desde adentro para saber si la devolución de llamada es un " duplicado " o no.

¿Fue útil?

Solución

Podría usar sigc :: bind para suministrar el elemento como un argumento a la función de devolución de llamada.

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

Luego puedes usar item- > get_active () en la devolución de llamada para responder solo a las activaciones.

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

Otros consejos

Eso es lo que yo también hago, me conecto a signal_toggled () y comprueba si get_active () es verdadero.

No sé exactamente lo que está intentando lograr (o qué es MyClass y de qué clases base hereda), pero conectarse a signal_toggled () puede ser más útil que signal_activate ()

/ De acuerdo con Johannes. Compruebe si el elemento está activado al recibir la señal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top