-1

我有一个表格,里面有输入框、标签和按钮。

目前,如果我编译代码,我可以从文本框中获取输入,但前提是用户按下回车键,并且文本仅来自他们当前正在输入的框。

当按下“登录”按钮时,我希望能够从两个文本框中获取输入。我尝试使用与输入框上的输入键相同的回调函数,但 GTK 给了我一个错误。

如果有人可以向我展示一些代码,允许我从表格内的输入框中获取文本(我知道从表格和 v/box 中检索数据的方法不同),我将不胜感激,因为我可以'似乎在任何教程中都找不到它。

将更新 w/工作代码。

尝试将状态栏附加到表格时出错:

(条目:5526):Gtk-CRITICAL **:gtk_table_attach:断言 `child->parent == NULL' 失败

(条目:5526):GLib-GObject-WARNING **:来自GtkTable' toGtkStatusbar 的无效转换'

4

1 回答 1

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忘记GtkEntrymain.


作为使用(静态)全局变量的替代方法,创建一个数据结构来保存条目:

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 。entry2ld->entry1ld->entry2g_freeg_free(ld)

顺便说一句,对于这个程序,您不需要两个单独的回调,删除enter_callback并只callback用于两者。

于 2013-07-28T00:05:17.810 回答