gpt4 book ai didi

callback - 将附加参数传递给 gtk 函数

转载 作者:行者123 更新时间:2023-12-02 22:00:35 26 4
gpt4 key购买 nike

我正在尝试学习如何使用 gtk+ 3.0 制作 GUI。我想将一个简单的参数(一个整数)传递给回调函数,以便当我按下按钮时参数的值会发生变化。这是我的代码:

#include <gtk/gtk.h>

void buttonFunction(GtkWidget * widget, gpointer data, int & n){
n = 1;
}

int main(int argc, char ** argv){
int n = 0;
GtkWidget * window;
GtkWidget * button;

gtk_init(&argc,&argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
button = gtk_button_new_with_label("Osss");

gtk_container_add(GTK_CONTAINER(window),button);
gtk_widget_show_all(window);

g_signal_connect(G_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttonFunction), n);

gtk_main();

return 0;
}

我发现传递参数的唯一方法是作为指针:

void buttonFunction(GtkWidget * widget, gpointer * data);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttonFunction), &n);

如何以这种方式传递多个参数?

最佳答案

要传递多个参数,您需要定义一个结构体,填充它,然后将指向该结构体的指针作为 g_signal_connectgpointer user_data 参数传递,这是最后一个范围。然后在回调中,您只需将 user_data 参数转换为指向结构的指针。

int main (int argc, char **argv)
{
int n = 0;
GtkWidget *window;
GtkWidget *button;

gtk_init (&argc,&argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
button = gtk_button_new_with_label ("Osss");

gtk_container_add (GTK_CONTAINER(window), button);
gtk_widget_show_all (window);

g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

/* Here's the magic: you pass a pointer to the variable you'd like to modify
* in the callback, be it a simple variable or a struct */
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttonFunction), &n);

gtk_main();

return 0;
}

void on_button_clicked (GtkButton *button, gpointer user_data) /* No extra parameter here ! */
{
/* you cast to the type of what you passed as last argument of g_signal_connect */
int *pn = user_data;
*pn = 1;
}

您必须使用文档中定义的回调签名(请查看 GtkButton 文档的“信号”部分),您无法弥补。顺便说一句,您不能将 n 作为引用而不是指针传递。如果你想在 C++ 中使用 GTK,请查看 GTKmm。

关于callback - 将附加参数传递给 gtk 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22384333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com