下面是一个关于使用glade和vala的教程,可以找到这里
我遵循了说明,并确认我的代码与示例相同。
Vala的xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<signal name="destroy" handler="on_window1_destroy" swapped="no"/>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkEntry" id="entry1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="invisible_char">•</property>
</object>
<packing>
<property name="expand">False</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">False</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_button1_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface> 我编写的代码如下:
using Gtk;
/* When button click signal received */
public void on_button1_clicked (Button source) {
/* change button label to clicked! */
source.label = "Clicked!";
stderr.printf ("Clicked! --> ");
}
/* when window close signal received */
public void on_window1_destroy (Window source) {
Gtk.main_quit();
}
int main (string[] args) {
Gtk.init (ref args);
var builder = new Builder ();
/* getting the glade file */
builder.add_from_file ("sample.ui");
builder.connect_signals (null);
var window = builder.get_object ("window1") as Window;
var entry = builder.get_object ("entry1") as Entry;
var button = builder.get_object ("button1") as Button;
/* that's another way to do something when signal received */
button.clicked.connect (() => {
stderr.printf ("%s\n", entry.get_text ());
});
window.show_all ();
Gtk.main ();
return 0;
}当我运行编译后的vala时,我得到了窗口(如示例所示):

所以一切都很好。但是,当我尝试单击文本字段时,我会在控制台中得到一条Gtk关键错误消息:
(示例:16109):Gdk-关键**:gdk_device_get_n_axes:断言'gdk_device_get_source (设备) != GDK_SOURCE_KEYBOARD‘失败
我没有把注意力集中在球场上,因此我不能在球场上输入任何东西。我不知道为什么会发生这种事。我已经回顾了我所做的事情,我看不出我做错了什么。
顺便说一句,当我编译时,我注意到以下警告:
$ valac --pkg gtk+-3.0 --pkg gmodule-2.0 example.vala
example.vala:22.5-22.39: warning: unhandled error `GLib.Error'
builder.add_from_file ("sample.ui");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
example.vala.c: In function ‘main’:
example.vala.c:141:2: warning: ‘g_type_init’ is deprecated (declared at /usr/include/glib-2.0/gobject/gtype.h:669) [-Wdeprecated-declarations]
g_type_init ();
^
Compilation succeeded - 1 warning(s)发布于 2014-02-16 14:44:53
您需要将文本条目的can-focus属性设置为True,以便能够聚焦它(尽管我在代码中没有得到运行时错误)。
如果您正在使用GTK的最新版本(3.10),您可能希望阅读有关模板/复合小部件的内容,因为这样可以直接使用Gtk.Builder,您只需添加几个注释,就可以为您设置所有内容。
在GTK3中,expand & fill子属性被废弃为expand、hexpand、vexpand、halign和valign小部件属性,这些属性在分配和使用额外空间方面提供了更多的灵活性。
关于未处理错误的vala警告是因为代码没有捕获错误,例如未找到文件或返回builder.add_from_file的ui定义中的标记错误。
不要太担心第二个警告,vala正在为旧版本的glib生成代码,而不是您已经安装的版本。将--target-glib 2.36添加到vala命令行以修复它。
https://stackoverflow.com/questions/21806335
复制相似问题