我正在开发一个 GTK4 应用程序,使用 Glade 进行 UI 设计。我面临的主要问题是,当尝试验证以模态形式输入的输入值时,保存这些输入的变量似乎为空。
这是我的代码的相关部分:
“添加”按钮的信号处理程序:
void on_button_add_clicked(GtkButton *button, gpointer user_data)
{
printf("Add button was clicked\n");
// Declare the modal and confirm button locally
GtkBuilder *builder = gtk_builder_new_from_file("design.glade");
GtkWidget *modal_window = GTK_WIDGET(gtk_builder_get_object(builder, "add_item_modal"));
GtkWidget *confirm_button = GTK_WIDGET(gtk_builder_get_object(builder, "button_confirm"));
// Set parent window for the modal
GtkWindow *parent_window = GTK_WINDOW(user_data);
gtk_window_set_transient_for(GTK_WINDOW(modal_window), parent_window);
// Set the modal window for the "Confirm" button
g_signal_connect(confirm_button, "clicked", G_CALLBACK(on_button_confirm_clicked), modal_window);
// Present the modal window using gtk_window_present
gtk_window_present(GTK_WINDOW(modal_window));
// Release the builder
g_object_unref(builder);
}
“确认”按钮的信号处理程序:
void on_button_confirm_clicked(GtkButton *button, gpointer user_data)
{
GtkWidget *modal_window = GTK_WIDGET(user_data);
GtkBuilder *builder = gtk_builder_new_from_file("design.glade");
GtkWidget *first_name_entry = GTK_WIDGET(gtk_builder_get_object(builder, "first_name_entry"));
GtkWidget *second_name_entry = GTK_WIDGET(gtk_builder_get_object(builder, "second_name_entry"));
GtkWidget *id_entry = GTK_WIDGET(gtk_builder_get_object(builder, "id_entry"));
const char *first_name = gtk_editable_get_text(GTK_EDITABLE(first_name_entry));
const char *second_name = gtk_editable_get_text(GTK_EDITABLE(second_name_entry));
const char *id_text = gtk_editable_get_text(GTK_EDITABLE(id_entry));
if (strlen(first_name) == 0)
{
printf("input empty ");
}
else
{
printf("First Name: %s\n", first_name);
}
}
为什么保存输入值的变量为空? 如何正确检索和验证模式表单中的输入值? 任何有关解决此问题的帮助或指导将不胜感激。谢谢!
正如我在问题的答案中所说的 在 gtk C 上获取表单输入的值 问题在变量/对象的范围内。我在下面的脚本中展示了first_name_entry的可能解决方案。
// Signal handler for the "Add" button
void on_button_add_clicked(GtkButton *button, gpointer user_data)
{
GtkWidget *confirm_button;
GtkWidget *first_name_entry; // new
printf("Add button was clicked\n");
GtkBuilder *builder = gtk_builder_new_from_file("design.glade");
GtkWidget *modal_window = GTK_WIDGET(gtk_builder_get_object(builder, "add_item_modal"));
// Set parent window for the modal
GtkWindow *parent_window = GTK_WINDOW(user_data);
gtk_window_set_transient_for(GTK_WINDOW(modal_window), parent_window);
first_name_entry = GTK_WIDGET(gtk_builder_get_object(builder, "first_name_entry")); //new
confirm_button = GTK_WIDGET(gtk_builder_get_object(builder, "button_confirm"));
g_signal_connect(confirm_button, "clicked", G_CALLBACK(on_button_confirm_clicked), first_name_entry); // changed
// Present the modal window using gtk_window_present
gtk_window_present(GTK_WINDOW(modal_window));
g_object_unref(builder);
}
void on_button_confirm_clicked(GtkButton *button, gpointer user_data)
{
GtkWidget *first_name_entry = GTK_WIDGET(user_data);
const char *first_name = gtk_editable_get_text(GTK_EDITABLE(first_name_entry));
// const char *second_name =
gtk_editable_get_text(GTK_EDITABLE(second_name));
// const char *id_text = gtk_editable_get_text(GTK_EDITABLE(id_entry));
if (strlen(first_name) == 0)
{
printf("input empty ");
}
else
{
printf("First Name: %s\n", first_name);
}
// Additional logic...
}
要接管模态窗口的所有元素,您可以找到一种解决方案,例如 unable to add label to box by the click of a button gtk4 in C use 的答案中的解决方案。