我已经使用模板创建了一个自定义Gtk Widget,我想在其他Gtk Builder文件中使用它。
我做了什么:
<template class="G3JAMinScenes" parent="GtkBox">
当我使用g3jamin_scenes_new
创建它时,窗口小部件按预期工作,问题是我想使用Gtk Builder将其添加为窗口的子窗口,所以我写道:
...
<child>
<object class="G3JAMinScenes" parent="GtkBox" id="scnes">
</object>
</child>
...
但是当我尝试运行时会抛出错误:
Gtk-CRITICAL **: Error building template class 'G3JAMinAppWindow' for an instance of type 'G3JAMinAppWindow': Invalid object type `G3JAMinScenes'
答案 0 :(得分:2)
我还没有在任何文档中找到任何正式答案。我开始挖掘GTK +源代码并找到了一些东西。
当GtkBuilder
看到其尚未了解的类型时,它会尝试获取返回相关GType
的函数。它将尝试一些启发式方法来确定要调用的函数。如果您使用的是G_DEFINE_TYPE
系列宏,它将生成所需的必要mywidget_get_type
样式函数。如果你做了一些奇怪的事情,你也可以在你的ui文件中的对象的type-func
属性中指定函数。
但是,对于可能不起作用的简单程序(至少在Linux上),因为编译器可能不会在动态符号表中导出该函数,因此{{1}无法找到它。所以你有几个选择。
GtkBuilder
。这将在mywidget_get_type()
类型系统中注册类型,GObject
将能够找到它。我正在使用GtkBuilder
的子类,所以我在GtkApplication
中调用它。这感觉有点像黑客,但我决定使用这个解决方案,因为它看起来应该适用于所有情况。myapp_class_init
相关联。这会将所有符号放在动态符号表中,以便上述魔法允许-rdynamic
找到它。GtkBuilder
的工作原理相同。