创建属于你的信号

现在你已经看到了gtkmm中的信号于信号处理函数,你可能希望你自己的类使用相同的技术进行交互。你可以很轻松的使用libsigc++库实现这个需求。

这不是单纯的gtkmm或GUI问题。gtkmm使用libsigc++实现对GTK信号系统的代理封装。而对于新的非GTK信号,你可以使用sigc::signal<>模版创建属于自己的C++信号。

例如,要创建一个发送参数类型分别为boolint的信号,只需要按如下所示声明一个sigc::signal即可:

sigc::signal<void(bool, int)> signal_something;

你可以简单的将信号声明为公有成员变量,但是有些人讨厌这种声明,他们更喜欢如下所示的访问器方法:

class Server
{
public:
  //signal accessor:
  using type_signal_something = sigc::signal<void(bool, int)>;
  type_signal_something signal_something();

protected:
  type_signal_something m_signal_something;
};

Server::type_signal_something Server::signal_something()
{
  return m_signal_something;
}

然后你可以使用与连接gtkmm信号一样的语法连接到这个信号。例如:

server.signal_something().connect(
  sigc::mem_fun(client, &Client::on_server_something) );