我对本教程中的ListStore的工作方式有些困惑http://developer.gnome.org/gtkmm-tutorial/3.0/sec-treeview-examples.html.en
我几乎了解所有内容,除了row [m_Columns.m_ITEM] =值
我的问题是如何根据传递给重载[]的某些其他对象来知道将值设置为该行的哪一列。它只是检查类型是否相同?如果是这样,那么如果您有两个相同类型的列怎么办?它是否基于内存偏移量来确定它是哪一列?
我很难弄清楚从提供m_Columns实例的成员到确定应将值放入哪一列的过程。
我想我是否可以让某人解释内部模型如何在treemodel系统上发挥作用,例如创建时发生的事情,然后是添加新行的每一步,什么不行。
最佳答案
发生了一些模板欺骗行为。 TreeRow
的每个实例化都重载了TreeModelColumn<ColumnType>
中的数组运算符。为了允许您分配和读取该列,它返回一个代理对象(TreeValueProxy<ColumnType>
),该对象实际上实现了这些操作。代理对象是用于实现类似数组的对象的标准C++技术。代理包含对相关TreeRow
和TreeModelColumn<ColumnType>
对象的引用,这些引用用于执行实际工作。TreeModelColumn<ColumnType>
对象还存储与列类型相对应的gobject
类型,以及与列位置相对应的整数。最终将其用于与gtt +库和从TreeRow::set_value<ColumnType>()
和TreeRow::get_value<ColumnType>()
开始的接口(interface)。
如果要查看困惑的详细信息,请查看的源文件是here for TreeRow和here for TreeModelColumn。