1

我用 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("%p\n", lst);
  for (lp = lst; lp != NULL; lp = lp->next) {
    printf("%s\n", (char *)(lp->data));
  }

任何人?

4

2 回答 2

1

您的示例具有误导性:您可能还有其他代码未显示的问题。

以下测试用例使用您相同的循环并且不返回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("%p\n", lst);
    for (lp = lst; lp != NULL; lp = lp->next) {
        g_print("%p\n", (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>
于 2015-05-19T07:20:07.060 回答
0

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

这将是一个令人头疼的问题。UI 相当复杂(几百个小部件)。所以这意味着我必须在 Glade 拜访他们所有人以编辑他们的name……或者写一个脚本。这在以前效果很好。

于 2015-05-18T20:35:14.120 回答