C 如何在没有按钮的gtk_消息_对话框中执行操作
我对上述代码的问题是,C 如何在没有按钮的gtk_消息_对话框中执行操作,c,modal-dialog,gtk,gtk3,C,Modal Dialog,Gtk,Gtk3,我对上述代码的问题是,/*dou\u something*/部分从未到达。我也尝试过: 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
/*dou\u something*/
部分从未到达。我也尝试过:
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\u some
代码永远无法到达。我做错了什么?调用
gtk_dialog_run()
会阻塞程序流,因为它使用了嵌套的主循环;它相当于gtk_main()
gtk_dialog_run()
在对话框关闭时返回响应id,方法是单击其中一个对话框按钮,或使用窗口控件将其关闭
由于不使用任何按钮,因此关闭创建的对话框的唯一方法是使用窗口控件显式关闭它;该操作将生成一个GTK\u响应\u删除\u事件响应
如果要显示对话框并保持程序流,可以显示对话框,然后在需要时将其关闭:
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);
显然,您需要将控件返回到主循环,以便工具箱实际显示对话框。如果不将控制权返回主循环,就不能简单地调用show()
,执行一些操作,然后调用destroy()
:用户根本看不到对话框
公平地说,显示一个没有按钮的对话框,只显示“请等待…”并不是GUI的好例子;您应该使用GtkInfoBar
小部件或GtkStatusbar
通知用户长时间运行的操作正在进行。调用gtk\u dialog\u run()
会阻塞程序流,因为它使用的是嵌套的主循环;它相当于gtk_main()
gtk_dialog_run()
在对话框关闭时返回响应id,方法是单击其中一个对话框按钮,或使用窗口控件将其关闭
由于不使用任何按钮,因此关闭创建的对话框的唯一方法是使用窗口控件显式关闭它;该操作将生成一个GTK\u响应\u删除\u事件响应
如果要显示对话框并保持程序流,可以显示对话框,然后在需要时将其关闭:
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);
显然,您需要将控件返回到主循环,以便工具箱实际显示对话框。如果不将控制权返回主循环,就不能简单地调用show()
,执行一些操作,然后调用destroy()
:用户根本看不到对话框
公平地说,显示一个没有按钮的对话框,只显示“请等待…”并不是GUI的好例子;您应该使用GtkInfoBar
小部件或GtkStatusbar
通知用户长时间运行的操作正在进行。调用gtk\u dialog\u run()
会阻塞程序流,因为它使用的是嵌套的主循环;它相当于gtk_main()
gtk_dialog_run()
在对话框关闭时返回响应id,方法是单击其中一个对话框按钮,或使用窗口控件将其关闭
由于不使用任何按钮,因此关闭创建的对话框的唯一方法是使用窗口控件显式关闭它;该操作将生成一个GTK\u响应\u删除\u事件响应
如果要显示对话框并保持程序流,可以显示对话框,然后在需要时将其关闭:
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);
显然,您需要将控件返回到主循环,以便工具箱实际显示对话框。如果不将控制权返回主循环,就不能简单地调用show()
,执行一些操作,然后调用destroy()
:用户根本看不到对话框
公平地说,显示一个没有按钮的对话框,只显示“请等待…”并不是GUI的好例子;您应该使用GtkInfoBar
小部件或GtkStatusbar
通知用户长时间运行的操作正在进行。调用gtk\u dialog\u run()
会阻塞程序流,因为它使用的是嵌套的主循环;它相当于gtk_main()
gtk_dialog_run()
在对话框关闭时返回响应id,方法是单击其中一个对话框按钮,或使用窗口控件将其关闭
由于不使用任何按钮,因此关闭创建的对话框的唯一方法是使用窗口控件显式关闭它;该操作将生成一个GTK\u响应\u删除\u事件响应
如果要显示对话框并保持程序流,可以显示对话框,然后在需要时将其关闭:
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);
显然,您需要将控件返回到主循环,以便工具箱实际显示对话框。如果不将控制权返回主循环,就不能简单地调用show()
,执行一些操作,然后调用destroy()
:用户根本看不到对话框
公平地说,显示一个没有按钮的对话框,只显示“请等待…”并不是GUI的好例子;您应该使用GtkInfoBar
小部件或GtkStatusbar
,通知用户长时间运行的操作正在进行。非常感谢使用信息栏或状态栏的提示:)我是gtk新手,所以我不知道所有这些:)但是现在我使用信息栏,但它没有显示,因为我必须将其传递到主循环。我该怎么做?因为程序的这部分在main之外,所以它是一个单独的函数…使用while(gtk_events_pending())gtk_main_iteration()代码>解决我的问题:)不建议手动旋转事件循环:这意味着您将面临重入问题。您应该使用超时或空闲处理程序将正在通过对话框/信息栏屏蔽的操作安排到主循环中:请参阅g_timeout_add()和g_idle_add()。还可以选择使用线程,并在线程结束时安排GUI更新