是否可以在 XML 格式的信号中传递数据?

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

抱歉,如果标题有点尴尬,我不知道如何表达它。无论如何...

在代码中创建信号时,可以对其进行设置,以便在调用信号时将附加信息发送到处理程序:

GtkWidget *window;
GtkWidget *button;
g_signal_connect(button, "clicked", G_CALLBACK(example_pressed), window);

所以当按下按钮时,它会调用这个函数:

void example_pressed(GtkButton *self, GtkWindow *window){
    gtk_window_close(window);
}

这个函数所做的就是接收一个 GtkWindow 然后关闭它,如果我只使用代码,它工作得很好。

但是,我想使用 GtkBuilder 和 XML 文件复制此行为。创建信号并将其指向适当的函数非常简单,GtkBuilder 类的 API 文档中对此进行了解释:

<signal name="clicked" handler="example_pressed"/>

但是,文档没有解释我如何将更多数据传递给该函数。在这里,创建信号是不够的,我还需要将窗口传递给它。我环顾四周,找不到答案,也找不到执行此操作的示例项目。

但事实上,正如所提到的,文档没有对此进行任何说明,这让我想知道这是否可能。如果事实证明这是不可能的,那也不是什么大问题,因为我可以使用

gtk_builder_get_object
从 XML 文件中检索按钮并像以前一样在代码中创建信号,但我想确认是否确实如此这是不可能的,或者也许有一些我没有看到的东西。

c gtk gtk4
1个回答
0
投票

感谢Cambalache,我找到了答案。

GtkBuilder 类的文档提到了可以赋予

<signal>
标签的附加属性,即
object
。文档将其描述为“将信号处理程序绑定到属性引用的对象的生命周期”,这根本没有帮助,但通过 Cambalache 我发现这确实是我正在寻找的东西。

我将 XML 行从 OP 更改为

<signal name="clicked" handler="example_pressed" swapped="no" object="window"/>

(其中

"window"
是同一文件中 GtkApplicationWindow 对象的 id),并且能够确认按钮和窗口都已发送到 OP 中的
example_pressed
函数。现在,按下按钮时窗口会关闭。问题解决了!

附加说明:当创建像这样以 XML 形式发送对象的信号时,默认行为(至少在 GTK4 中)是表现为

swapped
属性存在并设置为
"yes"
。这会导致窗口作为第一个参数发送到信号处理程序,按钮作为第二个参数发送到信号处理程序。这会导致 OP 中编写的
example_pressed
函数给出错误并且不执行任何操作,因为它会看到我在不是窗口的对象上调用
gtk_window_close
。因此,为什么我将
swapped="no"
添加到该行,以便将对象按照与“单击”信号的文档匹配的顺序发送到处理程序。按钮第一个作为自身,窗口第二个作为窗口。

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