gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:21 24 4
gpt4 key购买 nike

我正在为一个学校项目学习 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);
}

关于尝试检索 GTKEntry 的文本值时出现严重错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36709339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com