GTK模态表单输入验证问题

问题描述 投票:0回答:1

我正在开发一个 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);
    }
}
  • 模态表单正确打开。
  • 在表单中输入输入值。
  • 但是,当尝试在 on_button_confirm_clicked 处理程序中访问和验证这些值时,变量显示为空。

为什么保存输入值的变量为空? 如何正确检索和验证模式表单中的输入值? 任何有关解决此问题的帮助或指导将不胜感激。谢谢!

c user-interface gtk gtk3
1个回答
0
投票

正如我在问题的答案中所说的 在 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 的答案中的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.