SFML和GTK + - GtkFileChooserDialog

时间:2011-07-31 15:13:09

标签: c++ dialog gtk sfml filechooser

我正在使用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));

对话框正在显示,但不会被破坏:(

1 个答案:

答案 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;
}