json - 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"
}]
}
解决方案
有两件事可以让这个工作:
- 将 ClutterScript 中的处理程序名称与 Vala 生成的名称匹配
- 将处理程序名称导出到二进制文件的动态符号表
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
将在该列表中。
推荐阅读
- python - matplotlib hexbins 中的十六进制大小基于附近点的密度
- javascript - javascript禁用复选框
- python - python修补类对象上的方法
- python - 如何使用 Fiona 加速多边形操作中的点?我有大约 1300 万条记录和一个包含 640 个多边形的 shapefile
- anylogic - 收集资源池的统计信息
- python - 保存模型后得到错误的预测
- masstransit - System.OperationCanceledException:代理已停止或已停止,无法创建额外的挑衅者
- google-apps-script - 调整第 3 行的高度和工作表底部(工作表中的行数不断变化)[Google Sheets]
- python - mean_y = np.mean(Y) TypeError: /: 'str' 和 'int 不支持的操作数类型
- html - 为什么在恢复过滤器后设置颜色会损失精度?