关于在GtkAlertDialog中使用GCancellable的实用场景疑问
我太懂这种啃完文档却找不到实际用法的憋屈了!咱先把GCancellable在GtkAlertDialog里的核心作用说透:它不是给用户手动点取消按钮用的(那是对话框本身的按钮逻辑),而是让你从代码层面主动取消还没被用户关闭的对话框——比如超时自动关闭、程序状态变化时强制关闭这类场景。
给你举几个实打实的实用场景,再结合你的代码改改示例,你一看就明白:
1. 超时自动取消对话框
比如你弹出确认框后,用户5秒没操作,就自动取消这个对话框,不用傻等用户手动点。咱可以这么改你的代码:
#include "g-cancellable.h" GCancellable *g_cancel = NULL; // 可以存在上下文或全局变量里 void presst(GObject* quelle, GAsyncResult* res, gpointer user_data) { GtkAlertDialog *dialog = GTK_ALERT_DIALOG(quelle); GError *err = NULL; int button = gtk_alert_dialog_choose_finish (dialog, res, &err); if (err) { g_print("An error occured!\n"); g_print("Error Message: %s\n", err->message); // 捕获代码主动取消的错误类型 if (g_error_matches(err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { g_print("对话框被程序主动取消了!\n"); } g_free(err); g_object_unref(g_cancel); return; } if (button == 1) g_print("Cancel\n"); if (button == 0) g_print("O.k.\n"); g_object_unref(dialog); g_object_unref(g_cancel); } // 超时触发的取消函数 gboolean timeout_cancel(gpointer data) { g_cancellable_cancel(g_cancel); return G_SOURCE_REMOVE; } void clicked (GtkWidget *button, gpointer user_data) { GtkAlertDialog *dialog = gtk_alert_dialog_new("提示", "你确定要执行这个操作吗?", NULL, NULL); g_cancel = g_cancellable_new(); // 设置5秒超时自动取消 g_timeout_add(5000, timeout_cancel, NULL); // 异步调用时传入cancellable实例 gtk_alert_dialog_choose(dialog, NULL, g_cancel, presst, NULL); }
这个例子里,对话框弹出5秒后,g_cancellable_cancel()会触发取消逻辑,presst函数里会捕获到G_IO_ERROR_CANCELLED的错误,这时候你就能处理超时取消的后续逻辑了。
2. 程序状态变化时取消对话框
比如你的程序正在后台下载文件,弹出了“是否暂停下载”的确认框,但突然下载完成了,这时候你就可以调用g_cancellable_cancel()主动取消这个对话框——毕竟下载都结束了,暂停操作也没意义了,总不能让用户对着一个无效对话框发呆吧。
3. 批量操作中的全局取消
如果你的程序在批量处理多个文件,每个文件都要弹出确认框,这时候你可以用同一个GCancellable实例绑定所有对话框。当用户点击全局的“取消所有操作”按钮时,只要调用一次g_cancellable_cancel(),就能把所有待处理的对话框都取消掉,不用一个个去单独处理,效率高多了。
回到你原来的代码,你之前只处理了用户手动点击对话框按钮的情况,加入GCancellable后,就能覆盖那些不需要用户手动操作、程序主动干预的场景啦。
备注:内容来源于stack exchange,提问作者Holger

