尝试检索GTKEntry的文本值时出现严重错误

时间:2016-04-19 05:29:40

标签: c gtk gtk3

我正在学习一个学校项目的GTK的基础知识,我正在尝试创建一个基本程序,它打印文本条目的值,因为它已被更改。虽然我得到了某种类型的输出,但这是一个严重的错误:

Gtk-CRITICAL **: gtk_entry_get_text: assertion 'GTK_IS_ENTRY (entry)' failed
The text is : (null)

我的代码如下:

#include<gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "salesbase.h"
#include <sqlite3.h>
#include <unistd.h>

static void change_text(GtkWidget *widget, GtkEntry *data){
    const char* output = gtk_entry_get_text(data);
    printf("The text is : %s\n", output);
}

int main(int argc, char *argv[]){
    GtkBuilder *builder;
    gtk_init(&argc, &argv);
    GObject *window;
    GtkEntry *input;

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "ui/main.ui", NULL);

    window = gtk_builder_get_object(builder, "mainwindow");
    g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    input = GTK_ENTRY(gtk_builder_get_object(builder, "test_entry"));
    g_signal_connect(input, "changed", G_CALLBACK(change_text), &input);



    gtk_main();

    return 0;
}

1 个答案:

答案 0 :(得分:2)

g_signal_connect的第四个参数是gpointer,它是void *的别名,所以它已经是一个指针。 input是一个指针,所以如果你想传递它,你可以直接传递它:

g_signal_connect(input, "changed", G_CALLBACK(change_text), input);

传递&input有两个问题:它将指向指针(GtkEntry**)传递给期望指针(GtkEntry*)的函数,该指针失败;并且input是一个局部变量,因此您存储指向局部变量的指针,该局部变量可能超出范围(在此示例中没有问题,因为input超出主循环)。

但是,当您将信号连接到input时,默认情况下,该信号的接收器作为回调的第一个参数传递,因此您不必携带它,因此您可以将代码简化为:

g_signal_connect(input, "changed", G_CALLBACK(change_text), NULL);
...
static void change_text(GtkWidget *widget, gpointer data){
    const char* output = gtk_entry_get_text(GTK_ENTRY(widget));
    printf("The text is : %s\n", output);
}