2

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

对话框正在显示,但它没有被破坏:(

4

1 回答 1

2

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;
}
于 2011-07-31T18:02:22.387 回答