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
相关产品推荐
相关产品推荐

