2011-07-31 50 views
2

我正在写使用SFML的应用程序,我想用GTK +创建文件选择对话框。我有这样的代码:SFML和GTK + - GtkFileChooserDialog

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)); 

而且对话框显示,但它并没有被摧毁:(

回答

2

gtk_dialog_run documentation有一张纸条

After gtk_dialog_run() returns, you are responsible for hiding or destroying the dialog if you wish to do so.

所以对话不应该自动销毁,程序员必须这样做。


编辑:

的另一个问题是,你没有运行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()代替。你的代码可以somethink像

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; 
} 
+0

我接着说:gtk_widget_destroy(对话);'但它仍然不破坏:( – m4tx

+0

@ m4tx我已经延长我的回答,请检查是否现在解决您的问题 – Michy

+0

好的,谢谢。 ,但我现在有这个问题:'错误:无效转换从'void *'到'fch_result *''我不知道如何解决它。错误是在'struct fch_result * result = user_data;' – m4tx