是否可以指示 `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 警告

GTK Treeview 固定宽度

TreeViewColumn标头中的PyGTK Entry小部件

gtkmm 中树视图选择回调的签名和功能

是否可以更改 Wicket 活动指示器的颜色?