是否可以指示 `Gtk::TreeView` 显示自定义类型?
Is it possible to instruct a `Gtk::TreeView` to display a custom type?
有些事情我不明白如何使用 Gtkmm 3。
我有这样声明的自定义业务类型:
enum class Eurocents : int {};
我想将此类型渲染为 Gtk::TreeView
,其中模型为 Gtk::ListStore
。所以我声明了一个 Gtk::TreeModelColumn<Eurocents>
,并将其添加到模型中。然后我 append_column
这个模型专栏到 Gtk::TreeView
一个合适的标题。
然后我append_row
给模型,把列对应的值设为(Eurocents)100
。
我得到的结果是单元格显示为空。可以理解,因为我不希望 Gtkmm 知道如何呈现我的任意类型。
我想指导 Gtkmm 如何呈现我的类型。
我已经知道如何显示像 Glib::ustring
这样的 Glib 类型,并且可以格式化为 Glib::ustring
进行显示,但这不是问题的主题。
是否可以像这样对可以显示任意类型的列进行编码?如果是这样,怎么办?排序工作需要什么?
最常见、最简单的方法是使用 cell_data_func 回调。例如,您可以创建自己的 Gtk::TreeView::Column 实例(视图列),将单元格渲染器(或更多)打包到您的 Gtk::TreeView::Column 中,使用 Gtk::TreeView::Column 将 Gtk::TreeView::Column 附加到 TreeView =33=](),然后在 Gtk::TreeView::Column() 上调用 set_cell_data_func():
https://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeViewColumn.html#a3469e1adf42e5932ea123ec33e4ce4e1
您的回调将从模型中获取值并设置渲染器属性的适当值。
这是一个示例,展示了 set_cell_data_func() 的用法以及其他内容:
https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview-examples.html.en#sec-editable-cells-example
这个link应该也有用:
https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview.html.en#treeview-cellrenderer-details
如果您愿意,Gtk::TreeView::insert_column_with_data_func() 可以使它更简洁一些:https://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeView.html#a595dcc0b503a7c1004c296b82c51ac54
至于排序,您应该可以调用 set_sort_func() 来指定列的排序方式:https://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeSortable.html#a3a6454bd0a285324c71edb73e403cb1c
那么应该应用这个常规排序建议:https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview-sort.html.en
有些事情我不明白如何使用 Gtkmm 3。
我有这样声明的自定义业务类型:
enum class Eurocents : int {};
我想将此类型渲染为 Gtk::TreeView
,其中模型为 Gtk::ListStore
。所以我声明了一个 Gtk::TreeModelColumn<Eurocents>
,并将其添加到模型中。然后我 append_column
这个模型专栏到 Gtk::TreeView
一个合适的标题。
然后我append_row
给模型,把列对应的值设为(Eurocents)100
。
我得到的结果是单元格显示为空。可以理解,因为我不希望 Gtkmm 知道如何呈现我的任意类型。
我想指导 Gtkmm 如何呈现我的类型。
我已经知道如何显示像 Glib::ustring
这样的 Glib 类型,并且可以格式化为 Glib::ustring
进行显示,但这不是问题的主题。
是否可以像这样对可以显示任意类型的列进行编码?如果是这样,怎么办?排序工作需要什么?
最常见、最简单的方法是使用 cell_data_func 回调。例如,您可以创建自己的 Gtk::TreeView::Column 实例(视图列),将单元格渲染器(或更多)打包到您的 Gtk::TreeView::Column 中,使用 Gtk::TreeView::Column 将 Gtk::TreeView::Column 附加到 TreeView =33=](),然后在 Gtk::TreeView::Column() 上调用 set_cell_data_func(): https://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeViewColumn.html#a3469e1adf42e5932ea123ec33e4ce4e1
您的回调将从模型中获取值并设置渲染器属性的适当值。
这是一个示例,展示了 set_cell_data_func() 的用法以及其他内容: https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview-examples.html.en#sec-editable-cells-example
这个link应该也有用: https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview.html.en#treeview-cellrenderer-details
如果您愿意,Gtk::TreeView::insert_column_with_data_func() 可以使它更简洁一些:https://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeView.html#a595dcc0b503a7c1004c296b82c51ac54
至于排序,您应该可以调用 set_sort_func() 来指定列的排序方式:https://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeSortable.html#a3a6454bd0a285324c71edb73e403cb1c
那么应该应用这个常规排序建议:https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview-sort.html.en