Reemplazar manejadores de señales predeterminados

Hasta ahora se la ha enseñado a realizar acciones en respuesta a pulsaciones de botones o eventos similares manejando señales. Esa es seguramente una buena manera de hacer las cosas, pero no es la única.

En lugar de conectar manejadores de señales a señales laboriosamente, puede simplemente hacer una clase nueva que herede de un widget (por ejemplo, un botón) y luego reemplazar el manejador de señales predeterminado, como Button::on_clicked(). Esto puede ser mucho más simple que enganchar manejadores de señales para todo.

La herencia no es siempre la mejor manera de realizar cosas. Sólo es útil cuando quiere que el widget maneje su propia señal por sí mismo. Si quiere que alguna otra clase maneje la señal entonces necesitará conectar un manejador separado. Esto es aún más cierto si quiere que varios objetos manejen la misma señal, o si quiere que un manejador de señales responda a la misma señal desde diferentes objetos.

Las clases de gtkmm se diseñaron con los reemplazos en mente; contienen métodos miembro virtuales específicamente pensados para reemplazarse.

Eche un vistazo a un ejemplo de reemplazo:

#include <gtkmm/button.h>

class OverriddenButton : public Gtk::Button
{
protected:
    virtual void on_clicked();
}

void OverriddenButton::on_clicked()
{
    std::cout << "Hello World" << std::endl;

    // call the base class's version of the method:
    Gtk::Button::on_clicked();
}

Aquí se define una clase nueva llamada OverridenButton, que hereda de Gtk::Button. Lo único que se cambia es el método on_clicked(), que se llama siempre que Gtk::Button emite la señal clicked. Este método imprime «Hello World» a stdout y después llama al método original, reemplazado, para dejarle a Gtk::Button hacer lo que hubiera hecho si no se hubiera reemplazado.

No necesita llamar siempre al método del padre; hay veces en las que no querrá hacerlo. Tenga en cuenta que se ha llamado al método padre después de escribir «Hello World», pero se podría haber llamado antes. En este ejemplo simple, no importa mucho, pero hay veces en las que lo hará. Con señales, no es tan fácil cambiar detalles como este, y puede hacer algo aquí que no puede con manejadores de señales conectados: puede llamar al método padre en la mitad de su código personalizado.