您的回调函数(名为callback
)需要访问两个 GtkEntry 小部件才能获取它们的值。有几种方法可以实现这一点。许多 GTK C 程序使用全局变量,或具有文件范围的全局变量(即声明为文件内static
任何函数之外的变量)。
在任何函数之前删除文件顶部附近的entry1
和变量:entry2
static GtkWidget *entry1 = 0;
static GtkWidget *entry2 = 0;
然后像这样修改回调:
/* Our callback.
* The data passed to this function is printed to stdout */
static void callback( GtkWidget *widget, gpointer data)
{
const gchar *entry_text1;
const gchar *entry_text2;
g_print ("Hello again - %s was pressed\n", (char *) data);
entry_text1 = gtk_entry_get_text (GTK_ENTRY (entry1));
entry_text2 = gtk_entry_get_text (GTK_ENTRY (entry2));
g_print ("Contents of entries:\n%s\n%s\n", entry_text1, entry_text2);
}
您还应该对函数进行类似的修改enter_callback
,并且不要GtkWidget
忘记GtkEntry
从main
.
作为使用(静态)全局变量的替代方法,创建一个数据结构来保存条目:
typedef struct login_data
{
GtkWidget *entry1;
GtkWidget *entry2;
} login_data;
然后将其传递给回调(而不是像以前那样的文本字符串),回调更改如下:
static void callback( GtkWidget *widget, gpointer data)
{
login_data* ld = (login_data*)data;
const gchar *entry_text1;
const gchar *entry_text2;
entry_text1 = gtk_entry_get_text (GTK_ENTRY (ld->entry1));
entry_text2 = gtk_entry_get_text (GTK_ENTRY (ld->entry2));
g_print ("Contents of entries:\n%s\n%s\n", entry_text1, entry_text2);
}
数据结构是动态分配的,以防止它超出范围(在简单的应用程序中不是绝对必要的),这是在g_signal_connect
用于将回调连接到条目之前完成的:
login_data* ld = g_malloc(sizeof(*ld));
// callback function to execute when login is clicked
g_signal_connect (LoginButton, "clicked", G_CALLBACK (callback), (gpointer) ld);
使用此方法,您必须更改对和的所有引用entry1
和。最后,在程序退出之前,您应该调用动态分配的 struct ie 。entry2
ld->entry1
ld->entry2
g_free
g_free(ld)
顺便说一句,对于这个程序,您不需要两个单独的回调,删除enter_callback
并只callback
用于两者。