イベントボックスの使い方

概要

イベントボックスを使って非Xウィジットにイベントを設定する。

Gtk::Label, Gtk::ScrolledWindow などのウィジットは親ウィジットに直接描画される 非Xウィジットであり、そのままではマウスのボタンを押したなどのイベントを受け取ることが出来ない。 そこでGtk::EventBox にそれらを貼り付けて Gtk::EventBox にイベントを代理して受け取ってもらう。

ソース

eventbox.cpp

#include <gtkmm.h>
#include <iostream>

class MainWin : public Gtk::Window
{
    Gtk::Label m_label;
    Gtk::EventBox m_event;

public:
    MainWin();

private:
    virtual bool on_button_press( GdkEventButton* event );
};


MainWin::MainWin()
    : m_label( "label" )
{
    resize( 400, 300 );

    // プレスイベントの設定、及びシグナルとシグナルハンドラのコネクト
    m_event.set_events( Gdk::BUTTON_PRESS_MASK );
    m_event.signal_button_press_event().connect( sigc::mem_fun( *this, &MainWin::on_button_press ) );
    m_event.add( m_label );

    add( m_event );
    show_all_children();
}

// シグナルハンドラ
bool MainWin::on_button_press( GdkEventButton* event )
{
    std::cout << "press\n";

    return true;
}


int main( int argc, char *argv[] )
{
    Gtk::Main kit( argc, argv );
    MainWin mainwin;
    Gtk::Main::run( mainwin );

    return 0;
}

コンパイル

必要なコンパイルオプションは pkg-config を使って取得する。

g++ eventbox.cpp -o eventbox `pkg-config gtkmm-2.4 --cflags --libs`

結果

マウスボタンをクリックすると"press"という文字列が表示される。