将其他参数传递给gtk函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将其他参数传递给gtk函数相关的知识,希望对你有一定的参考价值。
我正在尝试学习如何使用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);
如何通过这种方式传递多个参数?
答案
要传递多个参数,请定义一个结构,填充该结构,然后将指向该结构的指针作为gpointer user_data
的g_signal_connect
参数传递,这是最后一个参数。然后在回调中,只需将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。
另一答案
有很多有用的宏,它们将整数(32位,不再是!)存储到指针中。
int a = 42;
gpointer ptr = GINT_TO_POINTER (a)
//GUINT_TO_POINTER (a), GBOOLEAN_TO_POINTER (a), GSIZE_TO_POINTER (a)
反向:
int a2 = GPOINTER_TO_INT (ptr);
//GPOINTER_TO_UINT (ptr), GPOINTER_TO_...
以上是关于将其他参数传递给gtk函数的主要内容,如果未能解决你的问题,请参考以下文章