c语言 - UI 文件不向gtk_builder_get_objects显示其小部件



我用Glade 3.18.3编辑了这个UI文件。我在(C) gtk程序中打开UI(这里没有问题,没有错误消息)。

然后我尝试使用gtk_builder_get_object从构建器对象中获取小部件引用,但无法找到任何。

我读到gtkbuilder曾经将小部件的name属性设置为id,但不再这样做了。所以我在几个小部件中定义了name,但这没有帮助。

在绝望中,我添加了一个简单的循环调用gtk_builder_get_objects,但这个函数返回NULL:

  GSList *lp, *lst = gtk_builder_get_objects(builder);
  printf("%pn", lst);
  for (lp = lst; lp != NULL; lp = lp->next) {
    printf("%sn", (char *)(lp->data));
  }

有人知道吗?

你的例子是误导:你可能有一些其他的问题,你的代码没有显示。

下面的测试用例使用相同的循环,并且不返回NULL。ui文件没有在对象上设置任何name。试试。

#include <gtk/gtk.h>
int main()
{
    GtkBuilder *builder;
    GSList *lp, *lst;
    gtk_init(NULL, NULL);
    builder = gtk_builder_new_from_file("test.ui");
    lst = gtk_builder_get_objects(builder);
    g_print("%pn", lst);
    for (lp = lst; lp != NULL; lp = lp->next) {
        g_print("%pn", (char *)(lp->data));
    }
    return 0;
}

这是test.ui:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">label</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button1">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

问题是包含小部件的窗口的name属性必须在UI中设置,否则gtk_builder_add_objects_from_file也不会工作。

这将是一个主要的头痛。UI非常复杂(有几百个小部件)。所以这意味着我必须在Glade访问他们所有人来编辑他们的name…或者写一个脚本。这个方法以前很有效。

相关内容

  • 没有找到相关文章

最新更新