Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在没有按钮的gtk_消息_对话框中执行操作_C_Modal Dialog_Gtk_Gtk3 - Fatal编程技术网

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更新