是否可以指示`Gtk :: TreeView`显示自定义类型?

时间:2015-12-27 18:42:46

标签: c++11 gtkmm gtkmm3

我不明白如何处理Gtkmm 3。

我有一个我自己声明的自定义业务类型:

[HttpPost]
public ActionResult EditFirstCharac(EditCharacViewModel vm)
{
    if (ModelState.IsValid)
    {
        // OK, save to DB or whatever and Redirect to a GET action (PRG pattern)
    }
    //Reload data
    vm.PossibleAnswers = charac.Question.PossibleAnswers
                        .ToListSelectListItem(p => p.Id.ToString(), p => p.Label).ToList();
    return View("Edit", vm);
}

我想将此类型呈现为enum class Eurocents : int {}; ,其中Gtk::TreeView为模型。所以我声明了Gtk::ListStore,并将其添加到模型中。然后我Gtk::TreeModelColumn<Eurocents>将此模型列添加到具有相应标题的append_column

我然后Gtk::TreeView到模型并将与列对应的值设置为append_row

我得到的结果是单元格显示为空。可以理解的是,因为我不希望Gtkmm知道如何渲染我的任意类型。

我想指导Gtkmm如何渲染我的类型。

我已经知道如何显示像(Eurocents)100这样的Glib类型,并且可以格式化为Glib::ustring进行显示,但这不是问题的主题。

是否可以对可以显示任意类型的列进行编码?如果是这样,怎么样?分拣工作需要什么?

1 个答案:

答案 0 :(得分: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