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() が戻った後、必要に応じてダイアログを非表示または破棄する必要があります。

したがって、ダイアログは自動的に破棄されるべきではなく、プログラマーが破棄する必要があります。


編集:

もう 1 つの問題は、GTK メイン ループ (gtk_main()またはそのバリアント) を実行していないため、GTK がウィジェットを破棄するために必要なイベントを処理できないことです (イベントが発生している間、GTK のどの部分も実行されていません)。これに対する解決策は、呼び出された後に関数を呼び出すために使用する別の質問への回答 です。この関数では、ダイアログが表示され、呼び出し元に結果が渡され、ダイアログが破棄され、GTK メイン ループを終了するために呼び出されます。gtk_idle_add()gtk_main()gtk_main_quit()

ただし、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 に答える