Chapter 8. ツリービューウィジット

Table of Contents

Gtk::TreeViewウィジットはデータのリストや木構造を列に持つことができます。

モデル

TreeViewオブジェクトはそれぞれTreeModelと結びつけられています。このモデルがTreeViewに表示されるデータを保持します。TreeModelはひとつ以上のTreeViewに対して使われてもかまいません。そうすれば、例えば、同じデータをふたつの違った方法で、同時に表示したり編集したりすることができます。ふたつのビューは同じモデルのデータを異なった列で表示するかもしれません。これはふたつのSQLクエリが同じデータベーステーブルから違ったフィールドを引き出すことがあるのと同じことです。

自分でモデルを実装することは理論的には可能ですが、通常はListStoreTreeStoreのどちらかのモデルクラスを使いたいと思うことでしょう。

Reference

行データに対応するListStore

ListStoreは単純な行のデータを保持します。これらの行には子データはありません。

Figure 8.1. TreeView - ListStore

TreeView - ListStore

Reference

階層構造に対応するTreeStore

TreeStoreは行のデータを保持しています。これらの行は子の行データを持っている場合があります。

Figure 8.2. TreeView - TreeStore

TreeView - TreeStore

Reference

モデルの列

TreeModelColumnRecordクラスは列データとその型を捕捉するのに使われます。TreeModelColumnインスタンスをColumnRecordadd()して、モデルの行データを取得、設定するときにはそのTreeModelColumnを使ってください。おそらく、新しくTreeModelColumnRecordを派生して、TreeModelcolumnインスタンスをメンバに持ったクラスを作ったほうが便利だと思うことでしょう。

class ModelColumns : public Gtk::TreeModelColumnRecord
{
public:

  ModelColumns()
    { add(m_col_text); add(m_col_number); }

  Gtk::TreeModelColumn<Glib::ustring> m_col_text;
  Gtk::TreeModelColumn<int> m_col_number;
};

ModelColumns m_Columns;

モデルを生成するにはColumnRecordを指定してください。このように:

Glib::RefPtr<Gtk::ListStore> refListStore = Gtk::ListStore::create(m_Columns);

行を追加する

モデルに行を追加するにはappend(), prepend(), insert()メソッドを使ってください。

Gtk::TreeModel::iterator iter = m_refListStore->append();

イテレータを逆参照して行を得ることが出来ます:

Gtk::TreeModel::Row row = *iter;

子の行を追加する

TreeStoreモデルは子要素を持つことができます。append(), prepend(), insert()メソッドを使って追加してください。このように:

Gtk::TreeModel::iterator iter_child = m_refListStore->append(row.children());

値を設定する

行のなかの特定の列にデータを設定するにはオーバーライドされたoperator[]が使えます。モデルを生成した時に使ったTreeModelColumnオブジェクトを指定してください。

row[m_Columns.m_col_text] = "sometext";

値を取得する

行のなかの特定の列のデータを取得するにはオーバーライドされたoperator[]が使えます。モデルを生成した時に使ったTreeModelColumnオブジェクトを指定してください。

Glib::ustring strText = row[m_Columns.m_col_text];
int number = row[m_Columns.m_col_number];

この時、不適切な型を使うと、コンパイラが注意してくることがあります。例えば、次の例はコンパイラエラーを引き起こします:

int number = row[m_Columns.m_col_text]; //compiler error - no conversion from
ustring to int.

"隠し"列

行に対してさらに余分にデータを対応させたい場合があるかもしれません。その場合、単にモデルにその列を追加し、ビューのほうに加えないようにしてください。