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

从GTK3迁移到GTK4:替代gtk_dialog_run的对话框实现方案

Gtk 4.10+ 中 GtkAlertDialog 的实现方案

在 Gtk 4.10 及后续版本中,实现 GTK 对话框存在一定难度,可参考的有效示例较少。以下是 gtk_alert_dialog_set_buttons 的API说明,以及适用于 Gtk 4.14 的可运行完整代码:

gtk_alert_dialog_set_buttons API 说明

void
gtk_alert_dialog_set_buttons (
GtkAlertDialog* self,
const char* const* labels
)
  • 参数 labels:类型为 char* 数组,用于设置对话框的新按钮标签
  • 强制要求:数组必须以 NULL 结尾

可运行代码(Gtk 4.14)

#include <gtk/gtk.h>
/*
 * 编译命令:
 * gcc -std=c11 -Wall -fmax-errors=10 -Wextra test_dialogue_01_gtk4.c -o test_dialogue_01_gtk4 `pkg-config --cflags --libs gtk4`
 */

// 对话框选择完成后的回调函数
void on_choose (GObject *source_object, GAsyncResult *res, gpointer user_data) 
{
  GtkAlertDialog *dialog = GTK_ALERT_DIALOG (source_object);
  GError *err = NULL;

  // 获取用户选择的按钮索引
  int button = gtk_alert_dialog_choose_finish (dialog, res, &err);

  if (err) {
    g_print("发生错误!\n");
    g_print("错误信息:%s\n", err->message);
    return;
  }

    if (button == 0)
    {
        g_print("已取消!\n");
        g_application_quit (G_APPLICATION (user_data));
    }
    else if (button == 1)
        g_print("继续执行后续操作!\n");
    else
        g_assert_not_reached(); // 逻辑上不应到达此处
    (void) user_data;
}

// 应用激活时的回调函数
void on_activate (GtkApplication *app) 
{
    // 创建主窗口
    GtkWidget *win = gtk_application_window_new (app);
    gtk_window_set_default_size (GTK_WINDOW (win), 400, 400);
    
    // 创建警告对话框并设置标题
    GtkAlertDialog *dialog = gtk_alert_dialog_new ("提示");
    // 定义按钮标签数组,必须以NULL结尾
    const char* buttons[] = {"取消", "继续", NULL};
    
    // 设置对话框详情内容
    gtk_alert_dialog_set_detail (dialog, "这里是提示消息的具体内容");
    // 为对话框设置按钮
    gtk_alert_dialog_set_buttons (dialog, buttons);
    // 将索引0的按钮设为取消按钮
    gtk_alert_dialog_set_cancel_button (dialog, 0);
    // 将索引1的按钮设为默认按钮(按下回车时触发)
    gtk_alert_dialog_set_default_button (dialog, 1);

    // 显示主窗口
    gtk_window_present (GTK_WINDOW (win));
    // 显示对话框,绑定回调函数与用户数据
    gtk_alert_dialog_choose (dialog, GTK_WINDOW (win), NULL, on_choose, app);
}

int main (int argc, char** argv) 
{
  // 创建Gtk应用实例
  GtkApplication *app = gtk_application_new ("org.example.alert-dialog", G_APPLICATION_DEFAULT_FLAGS);
  // 绑定应用激活信号到回调函数
  g_signal_connect (app, "activate", G_CALLBACK (on_activate), NULL);
  // 启动应用
  return g_application_run (G_APPLICATION (app), argc, argv);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:55:22