Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在GTK中获取按钮的文本?_C_Gtk - Fatal编程技术网

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;
}

我可以想到两个选项:

  • GTK小部件实际上是Gobject,因此您可以将任意数据段附加到它们。请参阅函数
    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用作参数,但我喜欢这些选项。