リストビュー
概要
Gtk::ListStoreとGtk::TreeViewを用いてリスト表示をする。gtkmmのリストビューはモデルクラスとビュークラスが分離しており、モデルクラスはGtk::ListStore、ビュークラスは Gtk::TreeViewである。
はじめにモデル( Gtk::ListStore )を作成する。 モデルを作成するためには列クラス( Gtk::TreeModelColumn )とレコード( Gtk::TreeModel::ColumnRecord ) が必要である。列をレコードに登録してからそのレコードを用いてモデルを作成する。
次にモデルをビュー( Gtk::TreeView )にセットする。モデルをビューにセットしたら表示する列を指定する(全ての列を表示する必要はない)。
新しい行を追加する場合はビューでは無くてモデルに対して行う。なお 一つのモデルは複数のビューで共有することも出来る。その場合はモデルを更新すると関連づけている全てのビューの 表示も同時に更新される。
ソース
listview.cpp
#include <gtkmm.h>
class MainWin : public Gtk::Window
{
Gtk::ScrolledWindow m_scrwin;
Gtk::TreeView m_treeview;
Gtk::TreeModelColumn< int > m_col_num;
Gtk::TreeModelColumn< Glib::ustring > m_col_name;
Gtk::TreeModel::ColumnRecord m_record;
Glib::RefPtr< Gtk::ListStore > m_liststore;
public:
MainWin();
};
MainWin::MainWin()
{
// レコード( Gtk::TreeModel::ColumnRecord )に列( Gtk::TreeModelColumn )を登録
m_record.add( m_col_num );
m_record.add( m_col_name );
// レコードを用いてモデル( Gtk::ListStore )作成。m_liststoreは Glib::Refptr なのでdeleteする必要はない
m_liststore = Gtk::ListStore::create( m_record );
// モデルをビュー( Gtk::TreeView )にセット
m_treeview.set_model( m_liststore );
// ビューに表示する列を指定
m_treeview.append_column( "番号", m_col_num );
m_treeview.append_column( "名前", m_col_name );
// モデルに行を追加するとビューの表示も同時に更新される
Gtk::TreeModel::Row row;
for( int i = 0; i < 10; ++i ){
row = *( m_liststore->append() );
row[ m_col_num ] = i;
row[ m_col_name ] = "ほげ";
}
// widgetのパック
m_scrwin.add( m_treeview );
add( m_scrwin );
show_all_children();
resize( 200,200 );
}
int main( int argc, char *argv[] )
{
Gtk::Main kit( argc, argv );
MainWin mainwin;
Gtk::Main::run( mainwin );
return 0;
}
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ listview.cpp -o listview `pkg-config gtkmm-2.4 --cflags --libs`
結果