自作シグナル
概要
シグナルを自作してコネクトする。
テンプレートを使用してシグナルクラスを作成するのだが、
typedef sigc::signal< 戻り値, 第一引数, 第二引数, .... > シグナル名;
の様にtypedefしておくと便利である。
あとはメンバ変数として作成したシグナルを定義し、それをコネクトするだけでよい。
ソース
sig3.cpp#include <gtkmm.h> #include <iostream> // 自作シグナルのtypedef typedef sigc::signal< bool, int > SIG_MY_CLICK; class MyButton : public Gtk::Button { int m_number; SIG_MY_CLICK m_sig_my_click; public: MyButton( const Glib::ustring& label, int number ) : Gtk::Button( label ), m_number( number ){} SIG_MY_CLICK sig_my_click(){ return m_sig_my_click; } protected: virtual void on_clicked(){ Gtk::Button::on_clicked(); // 自作シグナルのemit if( m_sig_my_click.emit( m_number ) ) Gtk::MessageDialog( "push button1" ).run(); } }; class MainWin : public Gtk::Window { Gtk::HBox m_hbox; MyButton m_b1, m_b2, m_b3; public: MainWin(); private: // 自作シグナル用のハンドラ bool on_my_click( int number ); }; MainWin::MainWin() : m_b1( "button1", 1 ), m_b2( "button2", 2 ), m_b3( "button3", 3 ) { // 自作シグナルとハンドラのコネクト m_b1.sig_my_click().connect( sigc::mem_fun( *this, &MainWin::on_my_click ) ); m_b2.sig_my_click().connect( sigc::mem_fun( *this, &MainWin::on_my_click ) ); m_b3.sig_my_click().connect( sigc::mem_fun( *this, &MainWin::on_my_click ) ); m_hbox.pack_start( m_b1 ); m_hbox.pack_start( m_b2 ); m_hbox.pack_start( m_b3 ); add( m_hbox ); show_all_children(); } // 自作シグナル用のハンドラ bool MainWin::on_my_click( int number ) { std::cout << "click " << number << std::endl; if( number == 1 ) return true; return false; } int main( int argc, char *argv[] ) { Gtk::Main kit( argc, argv ); MainWin mainwin; Gtk::Main::run( mainwin ); return 0; }
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ sig3.cpp -o sig3 `pkg-config gtkmm-2.4 --cflags --libs`
結果
