Skapa dina egna signaler
Nu då du sett signaler och signalhanterare i gtkmm kanske du vill använda samma teknik för att tillåta interaktion mellan dina egna klasser. Det är faktiskt väldigt enkelt genom att direkt använda libsigc++-biblioteket.
This isn't purely a gtkmm or GUI issue. gtkmm uses libsigc++ to implement its proxy wrappers for the GTK signal system, but for new, non-GTK signals, you can create pure C++ signals, using the sigc::signal<> template.
För att exempelvis skapa en signal som skickar 2 parametrar, en bool och en int, deklarerar du bara en sigc::signal, så här:
sigc::signal<void(bool, int)> signal_something;
You could just declare that signal as a public member variable, but some people find that distasteful and prefer to make it available via an accessor method, like so:
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;
}
Du kan sedan ansluta till signalen med samma syntax som du använder när du ansluter till gtkmm-signaler. Till exempel,
server.signal_something().connect(
sigc::mem_fun(client, &Client::on_server_something) );