You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GTK4 C程序:模态窗口表单取值编译错误解决请求

GTK4 C程序编译错误修复方案

核心问题梳理

你的代码存在以下几个导致编译失败的关键问题:

  • 未将确认按钮与信号处理函数绑定
  • 未将输入框控件与模态窗口关联(导致后续g_object_get_data无法获取有效指针)
  • 全局变量people数组、people_count未声明
  • 缺失必要的头文件引用

分步修复代码

1. 补充必要头文件

在代码开头添加:

#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>

2. 声明全局数据结构与变量

在头文件下方添加:

#define MAX_PEOPLE 100
typedef struct {
    char first_name[50];
    char second_name[50];
    char id[20];
} Person;

Person people[MAX_PEOPLE];
int people_count = 0;

3. 修复模态窗口创建代码(绑定信号与控件数据)

修改on_button_add_clicked函数,添加信号绑定和数据存储逻辑:

void on_button_add_clicked(GtkButton *button, gpointer user_data)
{
    GtkWindow *parent_window = GTK_WINDOW(user_data);

    // 创建模态窗口
    GtkWidget *modal_window = gtk_window_new();
    gtk_window_set_title(GTK_WINDOW(modal_window), "Add Item");
    gtk_window_set_transient_for(GTK_WINDOW(modal_window), parent_window);
    gtk_window_set_modal(GTK_WINDOW(modal_window), TRUE);

    // 创建垂直布局盒
    GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
    gtk_window_set_child(GTK_WINDOW(modal_window), box);

    // 设置布局边距
    gtk_widget_set_margin_start(box, 40);
    gtk_widget_set_margin_end(box, 40);
    gtk_widget_set_margin_top(box, 40);
    gtk_widget_set_margin_bottom(box, 40);

    // 姓名输入框
    GtkWidget *first_name_label = gtk_label_new("Enter first name:");
    GtkWidget *first_name_entry = gtk_entry_new();
    gtk_box_append(GTK_BOX(box), first_name_label);
    gtk_box_append(GTK_BOX(box), first_name_entry);
    // 将输入框绑定到模态窗口
    g_object_set_data(G_OBJECT(modal_window), "first_name_entry", first_name_entry);

    // 姓氏输入框
    GtkWidget *second_name_label = gtk_label_new("Enter second name:");
    GtkWidget *second_name_entry = gtk_entry_new();
    gtk_box_append(GTK_BOX(box), second_name_label);
    gtk_box_append(GTK_BOX(box), second_name_entry);
    g_object_set_data(G_OBJECT(modal_window), "second_name_entry", second_name_entry);

    // ID输入框
    GtkWidget *id_label = gtk_label_new("Enter ID (numbers only):");
    GtkWidget *id_entry = gtk_entry_new();
    gtk_entry_set_input_purpose(GTK_ENTRY(id_entry), GTK_INPUT_PURPOSE_DIGITS);
    gtk_box_append(GTK_BOX(box), id_label);
    gtk_box_append(GTK_BOX(box), id_entry);
    g_object_set_data(G_OBJECT(modal_window), "id_entry", id_entry);

    // 确认按钮
    GtkWidget *confirm_button = gtk_button_new_with_label("Confirm");
    gtk_box_append(GTK_BOX(box), confirm_button);
    // 绑定点击信号到处理函数
    g_signal_connect(confirm_button, "clicked", G_CALLBACK(on_confirm_button_clicked), NULL);

    // 显示模态窗口
    gtk_window_present(GTK_WINDOW(modal_window));
}

4. 修复确认按钮处理函数(完善逻辑)

取消原代码中被注释的核心逻辑,并补充字符串结束符处理:

void on_confirm_button_clicked(GtkButton *button, gpointer user_data)
{
    // 获取模态窗口与输入框
    GtkWidget *modal_window = gtk_widget_get_ancestor(GTK_WIDGET(button), GTK_TYPE_WINDOW);
    GtkWidget *first_name_entry = g_object_get_data(G_OBJECT(modal_window), "first_name_entry");
    GtkWidget *second_name_entry = g_object_get_data(G_OBJECT(modal_window), "second_name_entry");
    GtkWidget *id_entry = g_object_get_data(G_OBJECT(modal_window), "id_entry");

    // 获取输入文本
    const char *first_name = gtk_entry_get_text(GTK_ENTRY(first_name_entry));
    const char *second_name = gtk_entry_get_text(GTK_ENTRY(second_name_entry));
    const char *id = gtk_entry_get_text(GTK_ENTRY(id_entry));

    // 保存数据到数组
    if (people_count < MAX_PEOPLE) {
        strncpy(people[people_count].first_name, first_name, sizeof(people[people_count].first_name) - 1);
        // 手动添加字符串结束符,避免strncpy未自动添加的问题
        people[people_count].first_name[sizeof(people[people_count].first_name)-1] = '\0';
        strncpy(people[people_count].second_name, second_name, sizeof(people[people_count].second_name) - 1);
        people[people_count].second_name[sizeof(people[people_count].second_name)-1] = '\0';
        strncpy(people[people_count].id, id, sizeof(people[people_count].id) - 1);
        people[people_count].id[sizeof(people[people_count].id)-1] = '\0';
        people_count++;
    }

    // 关闭模态窗口
    gtk_window_close(GTK_WINDOW(modal_window));

    // 打印数组内容
    for (int i = 0; i < people_count; i++) {
        printf("Person %d: %s %s, ID: %s\n", i + 1, people[i].first_name, people[i].second_name, people[i].id);
    }
}

验证编译与运行

使用原编译命令重新编译:

gcc $( pkg-config --cflags gtk4 ) -o app tov.c $( pkg-config --libs gtk4 )

编译通过后运行./app,点击添加按钮弹出表单,输入内容后点击确认,即可看到终端打印存储的数据。

内容的提问来源于stack exchange,提问作者Oussama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:40:01