Reemplazar gestores 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 gestores 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 gestor de señales predeterminado, como Button::on_clicked(). Esto puede ser mucho más simple que enganchar gestores 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 gestor separado. Esto es aún más cierto si quiere que varios objetos manejen la misma señal, o si quiere que un gestor 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:
  void on_clicked() override;
}

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.

You don't always need to call the parent's method; there are times when you might not want to. Note that we called the parent method after writing "Hello World", but we could have called it before. In this simple example, it hardly matters much, but there are times when it will. With connected signal handlers, it's not quite so easy to change details like this, and you can do something here which you can't do at all with connected signal handlers: you can call the parent method in the middle of your custom code.