如何在GTK3中实现GtkDialog窗口的部件打包?
嘿,刚好对GTK2到GTK3的迁移这块熟得很,我来给你捋清楚怎么改~
在GTK3里,GtkDialog的vbox和action_area这两个结构体成员被隐藏了,没法直接像GTK2那样直接访问,得用官方提供的 getter 函数来获取对应的容器。下面是适配后的完整代码,我还补全了你没写完的滚动窗口policy设置:
// GTK3 实现代码 #include <gtk/gtk.h> int main(int argc, char *argv[]) { gtk_init(&argc, &argv); // 创建对话框 GtkWidget *dialog = gtk_dialog_new(); gtk_container_set_border_width(GTK_CONTAINER(dialog), 0); // 👉 获取对话框的主内容容器(对应GTK2里的vbox) GtkWidget *content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); // 创建滚动窗口并配置属性 GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_container_set_border_width(GTK_CONTAINER(scrolled_window), 10); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); // 补全你没写完的滚动策略设置,这里用自动适配的示例 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); // 将滚动窗口添加到内容区域 gtk_container_add(GTK_CONTAINER(content_area), scrolled_window); // 如果需要添加操作按钮(对应GTK2里的action_area) GtkWidget *action_area = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); GtkWidget *ok_btn = gtk_button_new_with_label("确认"); gtk_container_add(GTK_CONTAINER(action_area), ok_btn); // 显示所有部件并启动主循环 gtk_widget_show_all(dialog); gtk_main(); return 0; }
核心变化点:
- 替换直接访问结构体成员的方式:用
gtk_dialog_get_content_area()获取主内容容器,gtk_dialog_get_action_area()获取操作按钮区域 - 其他部件的创建、属性设置逻辑和GTK2基本一致,类型转换的写法也没变
- 如果你的GTK3版本在3.12以上,其实更推荐用
GtkHeaderBar配合普通GtkWindow来构建现代风格的对话框,但如果要兼容传统对话框的写法,上面的代码完全没问题
内容的提问来源于stack exchange,提问作者aseq
相关产品推荐
相关产品推荐

