Vala-Clutter Json UI-如何连接UI信号?

问题描述 投票:1回答:1

我正在尝试将基于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"
    }]
}
json user-interface vala clutter
1个回答
2
投票

有两件事可以使它正常工作:

  1. 将ClutterScript中的处理程序名称与Vala生成的名称进行匹配
  2. 将处理程序名称导出到二进制文件的动态符号表中

还有第三件事,该示例在程序运行时不会在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将在该列表中。

© www.soinside.com 2019 - 2024. All rights reserved.