是否可以指示 `Gtk::TreeView` 显示自定义类型?
Posted
技术标签:
【中文标题】是否可以指示 `Gtk::TreeView` 显示自定义类型?【英文标题】:Is it possible to instruct a `Gtk::TreeView` to display a custom type? 【发布时间】:2015-12-27 18:42:46 【问题描述】:有些事情我不明白如何使用 Gtkmm 3。
我有一个自定义业务类型,我声明如下:
enum class Eurocents : int ;
我想将此类型渲染为具有Gtk::ListStore
作为模型的Gtk::TreeView
。所以我声明了一个Gtk::TreeModelColumn<Eurocents>
,并将其添加到模型中。然后我把append_column
这个模型列给Gtk::TreeView
加上一个合适的标题。
然后我将append_row
设置为模型并将列对应的值设置为(Eurocents)100
。
我得到的结果是单元格显示为空。可以理解,因为我不希望 Gtkmm 知道如何呈现我的任意类型。
我想指导 Gtkmm 如何渲染我的类型。
我已经知道如何显示像 Glib::ustring
这样的 Glib 类型,并且可以格式化为 Glib::ustring
进行显示,但这不是问题的主题。
是否可以对可以显示任意类型的列进行编码?如果是这样,怎么办?排序需要什么?
【问题讨论】:
【参考方案1】:最常见、最简单的方法是使用 cell_data_func 回调。例如,您可以创建自己的 Gtk::TreeView::Column 实例(视图列),将单元格渲染器(或更多)打包到您的 Gtk::TreeView::Column 中,附加您的 Gtk::TreeView::使用 Gtk::TreeView::append_column() 将列添加到 TreeView,并在 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
此链接也应该很有用: 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
【讨论】:
谢谢。您能否详细说明应如何实现适当的可排序性? “创建自己的 TreeView::Column”是什么意思?子类化还是实例化? @LaurentLARIZZA 我的意思是一个实例。我已经编辑了答案以澄清这一点。 @LaurentLARIZZA 我添加了一些关于排序的内容。以上是关于是否可以指示 `Gtk::TreeView` 显示自定义类型?的主要内容,如果未能解决你的问题,请参考以下文章
Gtk+ 删除 Gtk::Treeview 上第一列的填充/边距
“将大小分配给...”在 Gtk.ScrolledWindow 中使用 Gtk.TreeView 时出现 GTK 警告