尝试检索 GTKEntry 的文本值时出现严重错误
Critical error when trying to retrieve text value of GTKEntry
我正在为一个学校项目学习 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;
}
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);
}
我正在为一个学校项目学习 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;
}
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);
}