Table of Contents
Gtk::TreeViewウィジットはデータのリストや木構造を列に持つことができます。
TreeViewオブジェクトはそれぞれTreeModelと結びつけられています。このモデルがTreeViewに表示されるデータを保持します。TreeModelはひとつ以上のTreeViewに対して使われてもかまいません。そうすれば、例えば、同じデータをふたつの違った方法で、同時に表示したり編集したりすることができます。ふたつのビューは同じモデルのデータを異なった列で表示するかもしれません。これはふたつのSQLクエリが同じデータベーステーブルから違ったフィールドを引き出すことがあるのと同じことです。
自分でモデルを実装することは理論的には可能ですが、通常はListStoreかTreeStoreのどちらかのモデルクラスを使いたいと思うことでしょう。
ListStoreは単純な行のデータを保持します。これらの行には子データはありません。
TreeStoreは行のデータを保持しています。これらの行は子の行データを持っている場合があります。
TreeModelColumnRecordクラスは列データとその型を捕捉するのに使われます。TreeModelColumnインスタンスをColumnRecordにadd()して、モデルの行データを取得、設定するときにはその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;
行のなかの特定の列にデータを設定するにはオーバーライドされた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.