gtk回调多个参数

gtk回调多个参数,gtk,gtk3,Gtk,Gtk3,它可以工作,但对于gtk_entry_get_text,它不会显示任何内容:( 我不明白…为什么它不能与gtk_entry_get_text一起使用?您需要了解gtk是一个事件驱动的工具包(与许多其他工具包一样)。您需要与事件进行交互。但在运行gtk_main之前,它不会检查事件。因此,您的问题是,您正在使用test.host=gtk_entry_get_text(gtk_entry)读取主机名(h_name)),但当时,小部件还没有显示,您甚至没有在其中键入任何内容!因此您基本上只是从中得到一

它可以工作,但对于gtk_entry_get_text,它不会显示任何内容:(

我不明白…为什么它不能与gtk_entry_get_text一起使用?

您需要了解gtk是一个事件驱动的工具包(与许多其他工具包一样)。您需要与事件进行交互。但在运行gtk_main之前,它不会检查事件。因此,您的问题是,您正在使用
test.host=gtk_entry_get_text(gtk_entry)读取主机名(h_name))
,但当时,小部件还没有显示,您甚至没有在其中键入任何内容!因此您基本上只是从中得到一个空字符串,这就是您单击“连接”按钮时显示的内容

一种方法是将指针指向结构中的小部件。这样,您可以从单击的b_回调中调用gtk_entry_get_text。这样,您得到的值就是当时文本输入小部件中的值

test.host="trying something"
#包括
#包括
类型定义结构{
GtkWidget*主机;
}榜样;
单击无效b_(GTK按钮*c_按钮,示例*测试){
g_print(“主机名:%s\n”,gtk_条目_获取_文本(gtk_条目(测试->主机));
}
int main(int argc,char*argv[]){
GtkWidget*窗口;
GtkWidget*网格;
GtkWidget*c_按钮;
GtkWidget*q_按钮;
GtkWidget*标签_主机;
GtkWidget*h_名称;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置标题(gtk_窗口(窗口),“FTP客户端”);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
gtk_容器_设置_边框_宽度(gtk_容器(窗口),10);
gtk_窗口设置可调整大小(gtk_窗口(窗口),错误);
grid=gtk_grid_new();
gtk_容器添加(gtk_容器(窗口),网格);
gtk网格设置行间距(gtk网格(网格),3);
label_host=gtk_label_new(“主机名”);
示例测试;
h_name=gtk_entry_new();
test.host=h_name;
gtk_条目_设置_占位符_文本(gtk_条目(h_名称),“主机名”);
c_按钮=gtk_按钮_新按钮,带有_标签(“连接”);
g_信号连接(c_按钮,“点击”,g_回调(b_点击),&测试);
q_按钮=gtk_按钮带_标签的新按钮(“退出”);
g_信号连接(q_按钮,“点击”,g_回调(gtk_主退出),空);
gtk_网格连接(gtk_网格(网格),标签_主机,0,0,1,1);
gtk_网格连接(gtk_网格(网格),h_名称,1,0,1,1);
gtk_网格连接(gtk_网格(网格),c_按钮,0,3,2,1);
gtk_网格连接(gtk_网格(网格),q_按钮,0,4,2,1);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
另一个更好的方法是,在不修改结构的情况下,在文本发生更改时请求通知。为此,请使用“”信号,因为GtkEntry实现了GtkEditable接口。请参阅“”


还请注意,
(gpointer*)和test
是错误的。test是一个结构,而&test是一个结构的地址。gpointer是一个空的*,即已经是一个指针,所以
gpointer*
是指向指针的指针,而不是&test。所以只需编写
&test

您需要了解GTK是一个事件驱动工具包(和许多其他方法一样)。您需要与事件交互。但在运行gtk_main之前,它不会检查事件。因此,您的问题是,您正在使用
test.host=gtk_entry\u get_text(gtk_entry(h_name))读取主机名
,但当时,小部件还没有显示,您甚至没有在其中键入任何内容!因此您基本上只是从中得到一个空字符串,这就是您单击“连接”按钮时显示的内容

一种方法是将指针指向结构中的小部件。这样,您可以从单击的b_回调中调用gtk_entry_get_text。这样,您得到的值就是当时文本输入小部件中的值

test.host="trying something"
#包括
#包括
类型定义结构{
GtkWidget*主机;
}榜样;
单击无效b_(GTK按钮*c_按钮,示例*测试){
g_print(“主机名:%s\n”,gtk_条目_获取_文本(gtk_条目(测试->主机));
}
int main(int argc,char*argv[]){
GtkWidget*窗口;
GtkWidget*网格;
GtkWidget*c_按钮;
GtkWidget*q_按钮;
GtkWidget*标签_主机;
GtkWidget*h_名称;
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置标题(gtk_窗口(窗口),“FTP客户端”);
gtk_窗口设置位置(gtk_窗口(窗口)、gtk_WIN_位置中心);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
gtk_容器_设置_边框_宽度(gtk_容器(窗口),10);
gtk_窗口设置可调整大小(gtk_窗口(窗口),错误);
grid=gtk_grid_new();
gtk_容器添加(gtk_容器(窗口),网格);
gtk网格设置行间距(gtk网格(网格),3);
label_host=gtk_label_new(“主机名”);
示例测试;
h_name=gtk_entry_new();
test.host=h_name;
gtk_条目_设置_占位符_文本(gtk_条目(h_名称),“主机名”);
c_按钮=gtk_按钮_新按钮,带有_标签(“连接”);
g_信号连接(c_按钮,“点击”,g_回调(b_点击),&测试);
q_按钮=gtk_按钮带_标签的新按钮(“退出”);
g_信号连接(q_按钮,“点击”,g_回调(gtk_主退出),空);
gtk_网格连接(gtk_网格(网格),标签_主机,0,0,1,1);
gtk_网格连接(gtk_网格(网格),h_名称,1,0,1,1);
gtk_网格连接(gtk_网格(网格),c_按钮,0,3,2,1);
gtk_网格连接(gtk_网格(网格),q_按钮,0,4,2,1);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
另一个更好的方法是,在不修改结构的情况下,当文本发生更改时,请求得到通知
#include <gtk/gtk.h>
#include <stdio.h>

typedef struct {
        GtkWidget *host;
} example;

void b_clicked (GtkButton *c_button, example *test){
        g_print("Hostname: %s\n", gtk_entry_get_text (GTK_ENTRY(test->host)));
}

int main (int argc, char *argv[]){

        GtkWidget *window;
        GtkWidget *grid;
        GtkWidget *c_button;
        GtkWidget *q_button;
        GtkWidget *label_host;
        GtkWidget *h_name;

        gtk_init (&argc, &argv);

        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW (window), "FTP Client");
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
        gtk_container_set_border_width (GTK_CONTAINER (window), 10);
        gtk_window_set_resizable(GTK_WINDOW(window), FALSE);

        grid = gtk_grid_new ();
        gtk_container_add (GTK_CONTAINER (window), grid);
        gtk_grid_set_row_spacing (GTK_GRID (grid), 3);

        label_host = gtk_label_new("Hostname");

        example test;
        h_name = gtk_entry_new();
        test.host = h_name;
        gtk_entry_set_placeholder_text (GTK_ENTRY (h_name), "Hostname");
        c_button = gtk_button_new_with_label ("Connect");
        g_signal_connect (c_button, "clicked", G_CALLBACK (b_clicked), &test);
        q_button = gtk_button_new_with_label ("Quit");
        g_signal_connect (q_button, "clicked", G_CALLBACK (gtk_main_quit), NULL);

        gtk_grid_attach (GTK_GRID (grid), label_host, 0, 0, 1, 1);
        gtk_grid_attach (GTK_GRID (grid), h_name, 1, 0, 1, 1);
        gtk_grid_attach (GTK_GRID (grid), c_button, 0, 3, 2, 1);
        gtk_grid_attach (GTK_GRID (grid), q_button, 0, 4, 2, 1);

        gtk_widget_show_all (window);

        gtk_main ();

        return 0;
}