提问人:Maf95 提问时间:11/10/2023 最后编辑:Maf95 更新时间:11/11/2023 访问量:41
是否可以在XML中发出的信号中传递数据?
Is it possible to pass data in signals made in XML?
问:
对不起,如果标题有点尴尬,我不知道该怎么表达。无论如何。。。
在代码中创建信号时,可以对其进行设置,以便在调用信号时将其他信息发送到处理程序:
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文件复制此行为。创建信号并将其指向 appropiate 函数非常简单,这在 GtkBuilder 类的 API 文档中进行了解释:
<signal name="clicked" handler="example_pressed"/>
但是,文档没有解释如何将更多数据传递给该函数。在这里,仅仅创建信号是不够的,我还需要将窗口传递给它。我环顾四周,找不到答案,也找不到这样做的示例项目。
但事实上,如前所述,文档对此没有任何说明,这让我怀疑这是否可能。如果事实证明这是不可能的,那将不是一个大问题,因为我可以使用它来从 XML 文件中检索按钮并像以前一样在代码中创建信号,但我想确认它是否真的不可能,或者也许有什么我没有看到的东西。gtk_builder_get_object
答:
多亏了 Cambalache,我找到了答案。
GtkBuilder类的文档提到了一个可以赋予标签的附加属性,即.文档将其描述为“将信号处理程序绑定到属性引用的对象的生存期”,这根本没有帮助,但通过 Cambalache,我发现它确实是我想要的。<signal>
object
我将 XML 行从 OP 更改为
<signal name="clicked" handler="example_pressed" swapped="no" object="window"/>
(其中是同一文件中GtkApplicationWindow对象的id),并且能够确认按钮和窗口都已发送到OP中的函数。现在,按下按钮时窗口将关闭。问题解决了!"window"
example_pressed
附加说明:当创建像这样在XML中发送对象的信号时,默认行为(至少在GTK4中)是表现得好像属性存在并设置为.这会导致窗口作为第一个参数发送到信号处理程序,将按钮作为第二个参数发送到信号处理程序。这会导致 OP 中编写的函数出现错误并且不执行任何操作,因为它会看到我正在调用一个不是窗口的对象。因此,我为什么要添加到该行中,以便将对象以与“单击”信号的文档匹配的顺序发送到处理程序。按钮首先是自己,第二个窗口是窗口。swapped
"yes"
example_pressed
gtk_window_close
swapped="no"
评论