gpt4 book ai didi

c - 如何使用没有按钮的 gtk 消息对话框执行操作

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:57 26 4
gpt4 key购买 nike

GtkWidget *infoDialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO ,GTK_BUTTONS_NONE, "Please wait...");
gtk_dialog_run(GTK_DIALOG (infoDialog));

/* do_something */

gtk_widget_destroy(infoDialog);

上面代码的问题是 /* do_something */ 部分永远不会到达。我也尝试过:

GtkWidget *infoDialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO ,GTK_BUTTONS_NONE, "Please wait...");
gint r = gtk_dialog_run(GTK_DIALOG (infoDialog));
gtk_dialog_response(GTK_DIALOG(infoDialog), GTK_RESPONSE_OK);
if(r == GTK_RESPONSE_OK){
/* do_something */
}
gtk_widget_destroy(infoDialog);

而且使用此解决方案,永远不会到达do_something 代码。
我做错了什么?

最佳答案

调用 gtk_dialog_run() 会阻塞程序流程,因为它使用了嵌套的主循环;它等同于 gtk_main()gtk_dialog_run() 在关闭对话框时返回响应 ID — 通过单击其中一个对话框按钮,或使用窗口控件关闭它。

因为您不使用任何按钮,所以关闭您创建的对话框的唯一方法是使用窗口控件显式关闭它;该操作会生成一个 GTK_RESPONSE_DELETE_EVENT 响应。

如果你想显示对话框并保持程序流畅,你可以显示对话框然后在需要时关闭它:

GtkWidget *dialog = gtk_message_dialog_new (...);

gtk_widget_show (dialog);

/* start a long running operation inside an idle handler,
* or a timeout, or a thread, and at the end of the operation
* call gtk_widget_destroy() on the dialog
*/

显然,您需要将控制返回到主循环,以便工具包实际显示对话框。您不能简单地调用 show(),执行一些操作,然后调用 destroy() 而不将控制权返回到主循环:用户根本看不到对话框。

公平地说,显示一个没有按钮且只显示“请稍候...”的对话框并不是 GUI 的一个很好的例子;您应该使用 GtkInfoBar 小部件或 GtkStatusbar 来通知您的用户正在进行长时间运行的操作。

关于c - 如何使用没有按钮的 gtk 消息对话框执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21674384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com