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

C 尝试检索GTKEntry的文本值时出现严重错误,c,gtk,gtk3,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 <

我正在为一个学校项目学习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;
}
#包括
#包括
#包括
#包括
#包括“salesbase.h”
#包括
#包括
静态无效更改_文本(GtkWidget*小部件、GtkEntry*数据){
const char*output=gtk_entry_get_text(数据);
printf(“文本为:%s\n”,输出);
}
int main(int argc,char*argv[]){
GtkBuilder*builder;
gtk_init(&argc,&argv);
GObject*窗口;
GtkEntry*输入;
builder=gtk_builder_new();
gtk_builder_从_文件添加_(builder,“ui/main.ui”,NULL);
window=gtk_builder_get_对象(builder,“主窗口”);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
输入=GTK_条目(GTK_生成器_获取_对象(生成器,“测试_条目”));
g_信号连接(输入,“更改”,g_回调(更改文本),&输入);
gtk_main();
返回0;
}
的第四个参数是
gpointer
,它是
void*
的别名,因此它已经是一个指针了
input
是一个指针,因此如果要传递它,可以直接传递:

g_signal_connect(input, "changed", G_CALLBACK(change_text), input);
传递
&input
有两个问题:它将指向指针的指针(
GtkEntry**
)传递给期望指针的函数(
GtkEntry*
),但失败;而
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);
}

不要将
&input
传递到
g_信号连接()
input
已经是一个指针,因此
&input
实际上是一个指向局部变量的指针,您不想将其用作对象本身。只传递
input
。谢谢,这也解释了关于GTK的更多内容