ツリービュー
概要
ツリービューはリストビューで使ったモデル( Gtk::ListStore )の代わりに Gtk::TreeStroe を使用する。 ビューとしてはリストビューと同じGtk::TreeViewを使用する。基本的にはリストビューと同じようにして作成することが出来るが、ある行のサブディレクトリに 行を追加する場合は親となる行を指定する必要がある。 具体的には Gtk::TreeModel::Row parent_row を親行としたとき、Gtk::TreeStore::append( parent_row.children() ) として行を追加する。 より複雑なツリー構造の作成については次回説明する。
ソース
treeview.cpp#include <gtkmm.h> // 派生レコードクラス class MyRecord : public Gtk::TreeModel::ColumnRecord { public: Gtk::TreeModelColumn< Glib::ustring > m_col_name; MyRecord(){ // レコード( Gtk::TreeModel::ColumnRecord )に列( Gtk::TreeModelColumn )を登録 add( m_col_name ); } }; ///////////////////// class MainWin : public Gtk::Window { Gtk::ScrolledWindow m_scrwin; Gtk::TreeView m_treeview; MyRecord m_record; Glib::RefPtr< Gtk::TreeStore > m_treestore; public: MainWin(); }; MainWin::MainWin() { // レコードを用いてモデル( Gtk::TreeStore )作成。m_treestoreは Glib::Refptr なのでdeleteする必要はない m_treestore = Gtk::TreeStore::create( m_record ); // モデルをビュー( Gtk::TreeView )にセット m_treeview.set_model( m_treestore ); // ビューに表示する列を指定 m_treeview.append_column( "名前", m_record.m_col_name ); // モデルに行を追加するとビューの表示も同時に更新される Gtk::TreeModel::Row row; // ルートにappend row = *( m_treestore->append() ); row[ m_record.m_col_name ] = "ほげ"; // サブディレクトリ row = *( m_treestore->append( row.children() ) ); row[ m_record.m_col_name ] = "サブ"; // サブディレクトリのサブディレクトリ row = *( m_treestore->append( row.children() ) ); row[ m_record.m_col_name ] = "サブサブ"; // 再びルートにappend row = *( m_treestore->append() ); row[ m_record.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++ treeview.cpp -o treeview `pkg-config gtkmm-2.4 --cflags --libs`
結果
