在gtk_dialog_run 文档中有一个注释
在 gtk_dialog_run() 返回后,如果您愿意,您有责任隐藏或销毁对话框。
所以对话框不应该被自动销毁,程序员必须这样做。
编辑:
另一个问题是您没有运行 GTK 主循环(gtk_main()
或其变体),因此 GTK 无法处理销毁小部件所需的事件(在事件出现时没有运行 GTK 的任何部分)。对此的解决方案是回答另一个问题,用于gtk_idle_add()
在调用后调用函数gtk_main()
。在此函数中显示对话框,将结果提供给调用者,对话框被销毁并被gtk_main_quit()
调用以终止 GTK 主循环。
但是,gtk_idle_add()
在 GTK+2.6 中已弃用,并且在 GTK+3.0 中不存在,因此g_idle_add()
应改为使用。你的代码可能有点像
struct fch_result {
gint response;
// other information to return like filename,...
};
static gboolean fch_dialog(gpointer user_data)
{
struct fch_result *result = (struct fch_result *) user_data;
GtkWidget *dialog = gtk_file_chooser_dialog_new ( ... );
result->response = gtk_dialog_run (GTK_DIALOG(dialog));
// now add other information to result
gtk_widget_destroy(dialog);
gtk_main_quit(); // terminate the gtk_main loop called from caller
return FALSE;
}
int main(int argc, char** argv)
{
gtk_init(&argc, &argv);
struct fch_result data;
g_idle_add(fch_dialog, &data);
gtk_main();
// continue with the program
return 0;
}