我正在使用SFML编写应用程序,我想使用GTK +创建文件选择器对话框。我有这段代码:
gtk_init(&argc, &argv);
GtkWidget *dialog;
dialog = gtk_file_chooser_dialog_new ("Open file...", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
gtk_dialog_run (GTK_DIALOG (dialog));
对话框正在显示,但不会被破坏:(
答案 0 :(得分:2)
在gtk_dialog_run documentation中有一个注释
gtk_dialog_run()返回后,如果您愿意,则负责隐藏或销毁对话框。
因此对话框不应该被自动销毁,程序员必须这样做。
<小时/> 编辑:
另一个问题是你没有运行GTK主循环(gtk_main()
或其变体),因此GTK无法处理销毁小部件所需的事件(事件发生时GTK的任何部分都没有运行)存在)。解决方法是answer to another question使用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;
}