ツリービュー

概要

ツリービューはリストビューで使ったモデル( 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`

結果