如何使用 Gtk::Builder 将正确的 Glib::RefPtr 存储到非小部件
How to store get a correct Glib::RefPtr to a non-widget using Gtk::Builder
使用Gtk::Builder
的get_widget
函数获取任何widget的Glib::RefPtr
是相当简单的,但是当涉及到获取其他对象时,相应的get_object
函数 returns Glib::Object
,它 不 很容易转换为所需的 class(例如 Gtk::TreeView
)。
这样做的合适方法是什么?
Glib::RefPtr 有一个静态模板函数,它允许一个人做需要做的事情。此函数在逻辑上称为 cast_static
.
示例代码可以是:
treeStore =
Glib::RefPtr< Gtk::TreeStore >::cast_static( builder->get_object("treestore1") );
最好使用Glib::RefPtr<TheDerivedype>::cast_dynamic(object)
。
但是,Gtk::TreeView(您在问题中提到)是 Gtk::Widget,因此您将使用 get_widget() 而不是 get_object()。
如果您的意思是,Gtk::TreeModel,好吧,在 Glade 中定义 GtkTreeModels,以便在 gtkmm C++ 代码中使用,这可能会起作用,因为我们最近在 gtkmm 中添加了一些修复:
https://bugzilla.gnome.org/show_bug.cgi?id=742637
但这不是我们通常期望的工作 - 许多 C++ 开发人员更喜欢在代码中完全定义 DataModel 结构的静态类型安全,而不依赖于 C 和 C++ 类型之间的转换。例如:https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview-model.html.en#treeview-model-liststore
使用Gtk::Builder
的get_widget
函数获取任何widget的Glib::RefPtr
是相当简单的,但是当涉及到获取其他对象时,相应的get_object
函数 returns Glib::Object
,它 不 很容易转换为所需的 class(例如 Gtk::TreeView
)。
这样做的合适方法是什么?
Glib::RefPtr 有一个静态模板函数,它允许一个人做需要做的事情。此函数在逻辑上称为 cast_static
.
示例代码可以是:
treeStore =
Glib::RefPtr< Gtk::TreeStore >::cast_static( builder->get_object("treestore1") );
最好使用Glib::RefPtr<TheDerivedype>::cast_dynamic(object)
。
但是,Gtk::TreeView(您在问题中提到)是 Gtk::Widget,因此您将使用 get_widget() 而不是 get_object()。
如果您的意思是,Gtk::TreeModel,好吧,在 Glade 中定义 GtkTreeModels,以便在 gtkmm C++ 代码中使用,这可能会起作用,因为我们最近在 gtkmm 中添加了一些修复: https://bugzilla.gnome.org/show_bug.cgi?id=742637
但这不是我们通常期望的工作 - 许多 C++ 开发人员更喜欢在代码中完全定义 DataModel 结构的静态类型安全,而不依赖于 C 和 C++ 类型之间的转换。例如:https://developer.gnome.org/gtkmm-tutorial/stable/sec-treeview-model.html.en#treeview-model-liststore