我正在尝试使用GtkBuilder和glade创建一个真正的简单GUI。为了实现这一点,我遵循Gtk + 3官方参考手册的教程。与原始代码的唯一区别在于,为简单起见,我没有连接到小部件的信号(因此也删除了它们的回调函数):
#include <gtk/gtk.h>
int
main (int argc,
char *argv[])
{
GtkBuilder *builder;
GObject *window;
GObject *button;
gtk_init (&argc, &argv);
/* Construct a GtkBuilder instance and load our UI description */
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "builder.ui", NULL);
gtk_main ();
return 0;
}
&#34; builder.ui&#34;本教程中使用的文件如下所示:
<interface>
<object id="window" class="GtkWindow">
<property name="visible">True</property>
<property name="title">Grid</property>
<property name="border-width">10</property>
<child>
<object id="grid" class="GtkGrid">
<property name="visible">True</property>
<child>
<object id="button1" class="GtkButton">
<property name="visible">True</property>
<property name="label">Button 1</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object id="button2" class="GtkButton">
<property name="visible">True</property>
<property name="label">Button 2</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object id="quit" class="GtkButton">
<property name="visible">True</property>
<property name="label">Quit</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
<property name="width">2</property>
</packing>
</child>
</object>
<packing>
</packing>
</child>
</object>
</interface>
......并且根本没有问题。该程序编译并生成所需的窗口。但是,当我尝试使用我自己的.ui文件(由glade 3.10.0生成)时,我根本得不到任何结果。应用程序进入主循环,不显示任何窗口。我正在使用的GUI文件是:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="Window">
<property name="can_focus">False</property>
<property name="border_width">15</property>
<child>
<object class="GtkLabel" id="fooLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">foobar</property>
</object>
</child>
</object>
</interface>
我做错了什么?
答案 0 :(得分:5)
您只是在阅读xml文件,您需要一些操作UI内容的代码,例如:在.ui中显示顶级窗口:
int main (int argc, char *argv[])
{
GtkBuilder *builder;
GtkWidget *window;
gtk_init (&argc, &argv);
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "tutorial.xml", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "Window"));
g_object_unref (G_OBJECT (builder));
gtk_widget_show (window);
gtk_main ();
return 0;
}
答案 1 :(得分:4)
您的UI文件和教程UI文件之间的区别在于此行,在GtkWindow小部件中:
<property name="visible">True</property>
没有它,你的窗口(以及它里面的一切)仍然是隐藏的,所以这就是为什么“没有”发生的原因。窗户在那里,它只是看不见。这条线
gtk_widget_show (window);
in nos'解决方案也解决了这个问题,但这就是为什么教程文件有效,而你的文件没有。
答案 2 :(得分:0)
我遇到了同样的问题,但尝试了上述所有方法并没有成功。
我习惯使用Windows上的C ++,但这是一个关于raspberry pi的glabian项目。
到目前为止,我唯一的解决方案是添加完整路径如下
gtk_builder_add_from_file (builder, "/home/pi/Documents/tutorial.xml", NULL);
我随后在编译器中包含了路径,但之后又没有窗口了。
答案 3 :(得分:0)
我遇到了同样的问题。一个在Ubuntu linux上显示正常的简单应用程序没有出现在Raspbian中。经过一些调试后,看起来Raspbian的GTKBuilder实现有一个bug。它不起作用。
解决方案: 1)手动将GUI描述XML转换为C / C ++ API(GTK +)调用。要么 2)编写一个小程序将GUI XML文件转换为C / C ++ API(GTK +)调用。
感谢。