我的桌子上装满了输入框,标签和按钮。
目前,如果我编译代码,我可以从文本框中获取输入,但仅当用户按下回车键时,文本才会来自他们当前正在输入的框。
我希望能够在按下“登录”按钮时从两个文本框中获取输入。我尝试使用与输入框上的回车键相同的回调函数,但GTK给了我一个错误。
如果有人能告诉我一些允许我从表格中的输入框中获取文本的代码(我知道从表格和v / box中检索数据的方法不同),我们将非常感激,我似乎无法在任何教程中找到它。
将更新w /工作代码。
尝试将状态栏附加到表时出错:
(条目:5526):Gtk-CRITICAL **:gtk_table_attach:断言`child-> parent == NULL'失败
(条目:5526):GLIB-GObject-WARNING **:来自GtkTable' to
GtkStatusbar'的无效演员
答案 0 :(得分:4)
您的回调函数(名为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
的{{1}}指针。
作为使用(静态)全局变量的替代方法,创建一个数据结构来保存条目:
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
和entry2
的所有引用更改为ld->entry1
和ld->entry2
。最后,在程序退出之前,您应该在动态分配的结构g_free
上调用g_free(ld)
。
顺便说一下,对于这个程序,您不需要两个单独的回调,删除enter_callback
,只使用callback
。