gpt4 book ai didi

gtk3 - 带有模板 UI 的自定义 Gtk 小部件

转载 作者:行者123 更新时间:2023-12-02 01:48:09 31 4
gpt4 key购买 nike

我已经创建了一个带有模板的自定义 Gtk Widget,我想在其他 Gtk Builder 文件中使用它。

我所做的:

  • <template class="G3JAMinScenes" parent="GtkBox"> 写了一个 .ui 文件
  • 编写小部件源代码 (.c/.h)

  • 当我用 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'

    最佳答案

    我无法在任何文档中找到对此的任何官方答案。我仔细研究了 GTK+ 源代码,但发现了一些东西。

    GtkBuilder看到一个它还不知道的类型,它试图获得一个返回相关 GType 的函数。 .它将尝试一些启发式方法来确定要调用的函数。如果您使用的是 G_DEFINE_TYPE 之一宏系列,它将生成必要的 mywidget_get_type需要的样式函数。如果你正在做一些奇怪的事情,你也可以在 type-func 中指定函数ui 文件中对象的属性。

    但是,对于可能无法运行的简单程序(至少在 Linux 上),因为编译器可能不会导出动态符号表中的函数,因此 GtkBuilder将无法找到它。所以你有几个选择。

  • 调用 mywidget_get_type()在您的应用程序早期的某个地方。这将在 GObject 中注册类型类型系统和 GtkBuilder将能够找到它。我正在使用 GtkApplication 的子类,所以我在 myapp_class_init 中调用它.这感觉有点像黑客,但我选择了这个解决方案,因为它似乎应该适用于所有情况。
  • 如果您使用 GCC,请使用 -rdynamic 链接最终的可执行文件.这会将所有符号放入动态符号表中,因此上述魔法将允许 GtkBuilder找到它。
  • 在共享库中构建您的小部件。我还没有尝试过这个,但我相信它应该与 -rdynamic 相同的原因起作用。作品。
  • 关于gtk3 - 带有模板 UI 的自定义 Gtk 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24235937/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com