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

