覆写默认信号处理函数

到现在为止,你已经学会了通过将自定义的信号处理函数连接到信号来响应按钮按下等动作。这是一种好方法,但不是唯一的方法。

你还可以创建一个从部件继承而来的新类,然后覆盖默认的信号处理函数(例如,Button::on_clicked()),这样你就可以省去将信号处理函数连接到信号的步骤。

子类化并不是银弹。它只在你只希望由部件自身来处理自己的信号时才好用。如果你需要用其他的类来处理信号,你还是需要为此将函数连接到目标信号上。这在你需要用多个对象处理同一个信号或者需要一个信号处理函数处理不同的对象的信号的时候会很不方便。

gtkmm类在设计的时候已经考虑到了覆写;它们包含了专门用于被覆写的虚成员函数。

让我们看一个覆写的例子:

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

在这我们定义了一个名为OverriddenButton的新类,该类继承自Gtk::Button。我们对其唯一的更改是on_clicked()成员函数,只要Gtk::Button发出clicked信号该成员函数就会被调用。这个成员函数将字符串"Hello World"打印到stdout,然后调用Gtk::Button已被覆写本该被调用的成员函数。

调用父方法不是必须的,你可以在不想做的时候不调用它。请注意在此我们在做完了想做的事情之后调用了父方法,而你当然可以在此函数的中间或是任何你想调用父方法的位置调用它。这对于通过连接到信号调用的信号处理函数是无法做到的。