ツリーの内容を表示する

概要

ある行のある列の中身は値をセットしたときと同様にして、行(Gtk::TreeModel::Row row)を 取得してから row[ m_record.m_col_name ] により取得できる。

また複数行のイテレータ( Gtk::TreeModel::iterator )は Gtk::TreeModel::children().begin() または Gtk::TreeModel::Row::children().begin() によって取得できる。前者はルートの直下にある行のイテレータを 後者はある行のサブディレクトリにある行のイテレータを取得する。 よってイテレータをデレファレンスすることによって Gtk::TreeModel::Row を順次取得できる。 下の例では再帰的にツリーを捜査することによりツリーの全ての行の内容を表示している。

ソース

前回使用した treeview2.cppの void MainWin::on_bt_clicked() を下のものに置き換え、 メソッド void MainWin::show_children( Gtk::TreeModel::Children children ) を追加する。

treeview3.cpp

//
// childern の中身を表示
//
void MainWin::show_children( Gtk::TreeModel::Children children )
{
    Gtk::TreeModel::iterator it = children.begin();
    for( ; it != children.end(); ++it )
    {
        Gtk::TreeModel::Row row = *it;
        std::cout << row[ m_record.m_col_name ] << std::endl;
        show_children( row.children() ); // サブディレクトリの中を再帰表示
    }
}

// ボタンを押すと呼ばれる
void MainWin::on_bt_clicked()
{
    show_children( m_treestore->children() );
} 


コンパイル

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

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

結果

ボタンを押すとツリーの内容が表示される

ルート1
サブ1
サブ2
サブサブ1
サブサブ2
サブサブ3
サブ3
サブサブ4
サブサブ5
ルート2