C 如何在GTK中获取按钮的文本?
我正在开发一个应用程序,它有一个数字键盘和一个文本框。当点击按钮时,文本框显示数字。 我需要为每个按钮编写一个函数?或者您可以传递文本和小部件作为参数C 如何在GTK中获取按钮的文本?,c,gtk,C,Gtk,我正在开发一个应用程序,它有一个数字键盘和一个文本框。当点击按钮时,文本框显示数字。 我需要为每个按钮编写一个函数?或者您可以传递文本和小部件作为参数 #include <stdio.h> #include <stdlib.h> #include <gtk/gtk.h> void callback( GtkWidget *widget, gpointer data ) { gtk_entry_append_text(e
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
void callback( GtkWidget *widget,
gpointer data )
{
gtk_entry_append_text(entry, text);
}
void create_button(GtkWidget* table,GtkWidget* entry,
int start_r,int end_r,
int start_c,int end_c,
char* label)
{
GtkWidget *button;
button = gtk_button_new_with_label (label);
g_object_set_data( G_OBJECT( button ),
"char", (gpointer)label );
g_signal_connect (button, "clicked",
G_CALLBACK (callback), entry);
gtk_table_attach_defaults (GTK_TABLE(table), button, start_c, end_c, start_r, end_r);
gtk_widget_show (button);
}
gint delete_event( GtkWidget *widget,
GdkEvent *event,
gpointer data )
{
gtk_main_quit ();
return(FALSE);
}
int main(int argc,char* argv[]){
GtkWidget *window;
//GtkWidget *button;
GtkWidget *table;
GtkWidget *entry;
//GtkWidget *label;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Armario");
g_signal_connect (GTK_OBJECT (window), "delete_event",
G_CALLBACK (delete_event), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 20);
table = gtk_table_new (2, 2, TRUE);
gtk_container_add (GTK_CONTAINER (window), table);
entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry),10);
gtk_entry_set_placeholder_text(GTK_ENTRY(entry),"Teste");
gtk_table_attach_defaults (GTK_TABLE(table), entry, 0, 2, 1, 2);
gtk_widget_show(entry);
create_button(table,entry,0,1,0,1,"Botao");
gtk_widget_show (table);
gtk_widget_show (window);
gtk_main ();
return 0;
}
#包括
#包括
#包括
无效回调(GtkWidget*小部件,
gpointer数据)
{
gtk_条目_附加_文本(条目,文本);
}
无效创建按钮(GtkWidget*表格、GtkWidget*条目、,
整数开始,整数结束,
int start_c,int end_c,
字符*标签)
{
GtkWidget*按钮;
按钮=gtk_按钮_带_标签的新_(标签);
g_对象设置_数据(g_对象(按钮),
“字符”(gpointer)标签);
g_信号连接(按钮,“点击”,
G_回调(回调),条目);
gtk_table_attach_默认值(gtk_table(table)、按钮、开始_c、结束_c、开始_r、结束_r);
gtk_小部件_显示(按钮);
}
gint delete_事件(GtkWidget*小部件,
GdkEvent*事件,
gpointer数据)
{
gtk_main_quit();
返回(假);
}
int main(int argc,char*argv[]){
GtkWidget*窗口;
//GtkWidget*按钮;
GtkWidget*表;
GtkWidget*条目;
//GtkWidget*标签;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_window_set_标题(gtk_window(window),“Armario”);
g_信号_连接(GTK_对象(窗口),“删除_事件”,
G_回调(删除_事件),NULL);
gtk_容器设置_边框宽度(gtk_容器(窗口),20);
table=gtk_table_new(2,2,TRUE);
gtk_容器添加(gtk_容器(窗口),表格);
entry=gtk_entry_new();
gtk_入口设置最大长度(gtk_入口(入口),10);
gtk_条目_设置_占位符_文本(gtk_条目(条目),“测试”);
gtk_table_attach_默认值(gtk_table(table),条目,0,2,1,2);
gtk_widget_show(条目);
创建按钮(表格,条目,0,1,0,1,“Botao”);
gtk_widget_show(表格);
gtk_widget_show(窗口);
gtk_main();
返回0;
}
我可以想到两个选项:
g\u对象\设置\数据/g\u对象\设置\数据\完整/g\u对象\获取\数据
。因此,您可以将文本作为附加数据添加到按钮中,并在需要时检索它malloc
对其进行声明,并使用g\u signal\u connect\u data
指定释放数据的函数:struct entry_and_text;
{
GtkWidget *w;
char *text;
};
void free_data(gpointer data, GClosure *closure)
{
free(data);
}
entry_and_text *data = (entry_and_text *)malloc(sizeof(entry_and_text));
data->w = entry;
data->text = label;
g_signal_connect_data (button, "clicked",
G_CALLBACK (callback), data, free_data, 0);
您的问题的答案是肯定的,您可以将Gtk+中的小部件传递给回调。实际上,信号回调的第一个参数是接收信号的按钮(通常是单击的按钮)。正如您在下面的示例代码中所看到的,您可以从按钮中提取其标签并将其用作文本
[...] /* In create_button... */
/* Make your buttons be notified when they are clicked */
g_signal_connect (button, "clicked", G_CALLBACK (on_button_clicked), entry);
[...]
/* Append the text in the button to the text entry */
void on_button_clicked (GtkButton *button, gpointer user_data)
{
GtkEntry *entry = user_data;
const gchar *text = gtk_button_get_label (button);
gint position = 0;
gtk_editable_insert_text (GTK_EDITABLE (entry), text, -1, &position);
}
我正在使用,因为它已经被弃用很长时间了。通过使用其最后一个参数,可以将“entry”参数传递给回调,该参数允许您指定需要在回调中访问的一些数据。然后,在“user_data”参数中,该信息可供回调使用
您的示例还可以通过使用来改进,我也不认为在“char”属性上调用g_object_set_数据有什么意义,因为文本已经在属性中设置好了(并通过检索) 过了一会儿,我有了一个主意。我记得将按钮的标签与函数gtk_entry_get_Label一起使用,并将entry用作参数,但我喜欢这些选项。