gpt4 book ai didi

c - 如何在 C 中使用 GTK 使用 G_CALLBACK 获取输入值

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:33 31 4
gpt4 key购买 nike

我正在使用 GTK、CodeBlocks 和 Glade 为我在学校项目中需要的东西设置一个登录窗口。它只是一个简单的表单、用户名、密码和一个连接按钮。问题是我无法获得输入的值,因为我无法使用回调将构建器发送到另一个函数。我试着尽可能简单地解释它,抱歉我的英语不好。

void verifyConnect(GtkButton *button, gpointer *builder){
GtkWidget *passwordInput;
GtkWidget *usernameInput;

passwordInput = GTK_WIDGET(gtk_builder_get_object(*builder, "passwordInput"));
usernameInput = GTK_WIDGET(gtk_builder_get_object(*builder, "usernameInput"));

const gchar *text1 = gtk_entry_get_text(GTK_ENTRY(passwordInput));
const gchar *text2 = gtk_entry_get_text(GTK_ENTRY(usernameInput));

g_print("Username : %s\n",text2);
g_print("Password : %s\n",text1);
}


void connectUser(){
GtkWidget *window;
GtkWidget *connectButton;

GtkBuilder *gtkBuilder = gtk_builder_new();
gtk_builder_add_from_file(gtkBuilder, "loginWindow.glade", NULL);

window = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "loginWindow"));

connectButton = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "connectButton"));
g_signal_connect (connectButton, "clicked",G_CALLBACK(verifyConnect),&gtkBuilder);

g_object_unref(G_OBJECT(gtkBuilder));

gtk_widget_show(GTK_WIDGET(window));
}

现在我在点击连接按钮时遇到了这个错误。我知道这个错误是什么,我只是不知道如何在 verifyConnect 函数中获取我的构建器:

(projet_c_gtk.exe:9928): Gtk-CRITICAL **: gtk_builder_get_object: assertion `GTK_IS_BUILDER (builder)' failed

(projet_c_gtk.exe:9928): Gtk-CRITICAL **: gtk_builder_get_object: assertion `GTK_IS_BUILDER (builder)' failed

(projet_c_gtk.exe:9928): Gtk-CRITICAL **: gtk_entry_get_text: assertion `GTK_IS_ENTRY (entry)' failed

(projet_c_gtk.exe:9928): Gtk-CRITICAL **: gtk_entry_get_text: assertion `GTK_IS_ENTRY (entry)' failed
Username : (null)
Password : (null)

最佳答案

罪魁祸首在这里:

g_signal_connect (connectButton, "clicked",G_CALLBACK(verifyConnect),&gtkBuilder);

gtkBuilder 变量已经是一个指针,因此将它的地址传递给 g_signal_connect() 最终使相应的回调参数成为一个指针指向一个指针。除了一个小细节:您传递的内存地址指向一个自动变量,这一切都很好而且花花公子。自动变量存储在堆栈中,并在使用它们的函数返回时被释放。之后,其他功能可能会根据需要分配相同的空间并重写它。

这是你需要做的来解决这个问题:

void verifyConnect(GtkButton *button, GtkBuilder *builder){
GtkWidget *passwordInput;
GtkWidget *usernameInput;

passwordInput = GTK_WIDGET(gtk_builder_get_object(builder, "passwordInput"));
usernameInput = GTK_WIDGET(gtk_builder_get_object(builder, "usernameInput"));

const gchar *text1 = gtk_entry_get_text(GTK_ENTRY(passwordInput));
const gchar *text2 = gtk_entry_get_text(GTK_ENTRY(usernameInput));

g_print("Username : %s\n",text2);
g_print("Password : %s\n",text1);
}


void connectUser(){
GtkWidget *window;
GtkWidget *connectButton;

GtkBuilder *gtkBuilder = gtk_builder_new();
gtk_builder_add_from_file(gtkBuilder, "loginWindow.glade", NULL);

window = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "loginWindow"));

connectButton = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "connectButton"));
g_signal_connect(connectButton, "clicked", G_CALLBACK(verifyConnect), gtkBuilder);

g_object_unref(G_OBJECT(gtkBuilder));

gtk_widget_show(GTK_WIDGET(window));
}

当参数按值传递时,它不再依赖于存储在其先前位置的任何内容。

…aaa 顺便说一句,你真的确定你需要在 connectUser() 中释放 gtkBuilder 吗?您也在 verifyConnect() 中使用它,因此您可能必须在 verifyConnect() 结束时释放它,而不是在 connectUser( )

关于c - 如何在 C 中使用 GTK 使用 G_CALLBACK 获取输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54406996/

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