3

我对这个 ListStore 在本教程中的工作方式感到有些困惑http://developer.gnome.org/gtkmm-tutorial/3.0/sec-treeview-examples.html.en

除了 row[m_Columns.m_ITEM] = value 之外,我几乎了解所有内容

我的问题是它如何知道根据传递给重载 [] 的其他对象将值设置为行中的哪一列。它只是检查类型是否相同?如果是这样,那么如果您有两个相同类型的列会发生什么?它是否根据内存偏移量来确定它是哪一列?

我很难弄清楚它是如何从提供 m_Columns 实例的成员到弄清楚它应该将值放入哪一列的。

我想如果我可以让某人解释一下内部如何在树模型系统上工作,那就太好了,比如创建时会发生什么,然后添加新行的每个步骤等等。

4

1 回答 1

4

有一些模板诡计正在发生。数组运算符 inTreeRow为 的每个实例化而重载TreeModelColumn<ColumnType>。为了允许您分配给列以及读取它,它返回一个TreeValueProxy<ColumnType>实际实现这些操作的代理对象 ()。代理对象是实现类数组对象的标准 C++ 技术。代理包含对其用于执行实际工作 的相关对象TreeRow和 对象的引用。TreeModelColumn<ColumnType>

TreeModelColumn<ColumnType>对象还存储了与列的gobject类型对应的类型,以及与列位置对应的整数。这最终用于与以TreeRow::set_value<ColumnType>()和开头的 gtk+ 库进行交互TreeRow::get_value<ColumnType>()

如果您想要杂乱的细节,要查看的源文件是 TreeRowTreeModelColumn

于 2012-06-28T18:33:24.993 回答