首页 > 解决方案 > Vala - Clutter Json UI - 如何连接 UI 信号?

问题描述

我正在尝试将基于 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"
    }]
}

标签: jsonuser-interfacevalaclutter

解决方案


有两件事可以让这个工作:

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

stdout还有第三件事,该示例在程序运行时不会打印,但stderr会打印。

ui.json我改变了:

    {
        "name": "activate",
        "handler": "onActivated"
    }

    {
        "name": "activate",
        "handler": "ui_demo_onActivated"
    }

Vala 生成的 C 中的名称包括类名。也可以通过查看 C 代码找到它。使用--ccode开关valac生成 C 文件。

这个符号也需要出现在二进制的动态符号表中。用于编写 ClutterScript 处理函数的GNOME 文档建议-export-dynamic应该传递给链接器。这是由 C 编译器完成的,此开关可以通过 using 传递给 C 编译valac-X -export-dynamic

valac --pkg clutter-1.0 -X -export-dynamic main.vala

您可以读取二进制文件中可用的动态符号。对于生成 ELF 二进制文件的平台,例如 Linux,请使用readelf --dyn-syms main,其中main是生成的二进制文件的名称。ui_demo_onActivated将在该列表中。


推荐阅读