我正在尝试将基于JSON的UI文件与Clutter一起使用。我想将信号从UI文件连接到Vala代码。
我已经尝试过类似的操作,它加载了UI但未连接信号。
如何连接UI文件中的信号?谢谢!
这是我的main.vala:
using Clutter;
class UIDemo {
public UIDemo()
{
var ui_json = new Script();
ui_json.load_from_file("ui.json");
ui_json.connect_signals(this);
Stage stage = (Stage)ui_json.get_object("main-stage");
stage.show();
}
protected void onActivated()
{
stdout.printf("ACTIVATED");
}
}
void main(string[] args)
{
Clutter.init(ref args);
var app = new UIDemo();
Clutter.main();
}
这是ui.json:
{
"id": "main-stage",
"type": "ClutterStage",
"color": "white",
"width": 800,
"height": 600,
"title": "Script demo",
"children": [{
"id": "hello-label",
"type": "ClutterText",
"x": 400,
"y": 300,
"text": "Hello, world!",
"color": "black",
"font-name": "Sans 48px"
}],
"signals": [
{
"name": "destroy",
"handler": "clutter_main_quit"
},
{
"name": "activate",
"handler": "onActivated"
}]
}
有两件事可以使它正常工作:
还有第三件事,该示例在程序运行时不会在stdout
上打印,但会在stderr
上打印。
在ui.json
中,我更改了:
{
"name": "activate",
"handler": "onActivated"
}
到
{
"name": "activate",
"handler": "ui_demo_onActivated"
}
由Vala生成的C语言中的名称包括类名称。也可以通过查看C代码找到它。使用--ccode
开关和valac
来生成C文件。
此符号也需要出现在二进制文件的动态符号表中。 GNOME documentation for writing ClutterScript handler functions建议将-export-dynamic
传递给链接器。这是由C编译器完成的,可以使用valac
从-X -export-dynamic
将此开关传递给C编译器:
valac --pkg clutter-1.0 -X -export-dynamic main.vala
您可以阅读二进制文件中可用的动态符号。对于生成ELF二进制文件的平台(例如Linux),请使用readelf --dyn-syms main
,其中main
是所生成的二进制文件的名称。 ui_demo_onActivated
将在该列表中。