C 尝试检索GTKEntry的文本值时出现严重错误
我正在为一个学校项目学习GTK的基础知识,我正在尝试创建一个基本程序,该程序在文本条目发生更改时打印文本条目的值。当我得到某种输出时,这是一个关键错误,它说: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-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的更多内容