Création de vos propres signaux
Maintenant que nous avons vu les signaux et les gestionnaires de signal dans gtkmm, vous aimeriez peut-être utiliser la même technique pour interagir entre vos propres classes. C'est vraiment très simple en utilisant directement la bibliothèque libsigc++.
Ce n'est pas à proprement parler un problème gtkmm ou d'interface utilisateur. gtkmm utilise libsigc++ pour implémenter ses habillages mandataires du système de signaux GTK+, mais pour des nouveaux signaux non GTK+, vous pouvez créer des signaux C++ purs en utilisant le modèle sigc::signal<>.
Par exemple, pour créer un signal qui envoie 2 paramètres, un de type bool et un de type int, déclarez juste un sigc::signal, ainsi :
sigc::signal<void, bool, int> signal_something;
Vous pouvez simplement déclarer ce signal comme une variable membre publique, mais certaines personnes trouvent cela détestable et préfèrent aménager son accessibilité via une fonction membre de mécanisme d'accès, ainsi :
class Server
{
public:
// mécanisme d'accès au signal :
typedef sigc::signal<void, bool, int> type_signal_something;
type_signal_something signal_something();
protected:
type_signal_something m_signal_something;
};
Server::type_signal_something Server::signal_something()
{
return m_signal_something;
}
Vous pouvez ensuite connecter le signal en utilisant la même syntaxe que celle utilisée pour connecter les signaux gtkmm. Par exemple,
server.signal_something().connect( sigc::mem_fun(client, &Client::on_server_something) );
- C.I. Exemple