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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:35:28