3

OpenGL GUI を使用してアプリケーションを作成しています。Windows ではGetOpenFilename、ユーザーがファイルを選択できるようにするために使用しています。

Gtk::FileChooserDialog(このチュートリアルに従って)を使用して、Gtk 用の Linux に同様の機能を実装しようとしました。Windows と Linux で関数のシグネチャを同じに保とうとしているので、例を次のように変更しました。

std::string browseFile( std::string filetypes )
{
    Gtk::Main kit(false);

    Gtk::FileChooserDialog dialog( "Please choose a file",
            Gtk::FILE_CHOOSER_ACTION_OPEN );
//    dialog.set_transient_for( kit.instance() );

    //Add response buttons the the dialog:
    dialog.add_button( Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL );
    dialog.add_button( Gtk::Stock::OPEN, Gtk::RESPONSE_OK );

    //Add filters, so that only certain file types can be selected:
    Glib::RefPtr<Gtk::FileFilter> filter_any = Gtk::FileFilter::create();
    filter_any->set_name( "Any files" );
    filter_any->add_pattern( "*" );
    dialog.add_filter( filter_any );

    //Show the dialog and wait for a user response:
    int result = dialog.run();

    //Handle the response:
    switch( result )
    {
        case( Gtk::RESPONSE_OK ):
        {
            std::cout << "Open clicked." << std::endl;

            //Notice that this is a std::string, not a Glib::ustring.
            std::string filename = dialog.get_filename(  );
            std::cout << "File selected: " <<  filename << std::endl;
            return filename;
        }
        case( Gtk::RESPONSE_CANCEL ): { std::cout << "Cancel clicked." << std::endl; break; }
        default: { std::cout << "Unexpected button clicked." << std::endl; break; }
    }
    return std::string( "" );
}

主な違いはset_transient_for、メイン ウィンドウが Gtk によって管理されていない (freeglut によって作成された) ため、ビットを削除したことです。

問題: ファイルを選択した後、ダイアログがフリーズします。アプリケーションは引き続き実行され、選択したファイルを処理できますが、フリーズするのはダイアログだけです。

ファイルを選択した後、ダイアログ ボックスを強制終了するにはどうすればよいですか? 試してみdialog.hide()ましたが、効果がないようです。また、この関数に Gtk 固有のコードを含めint main()、プラットフォーム固有のコードを排除しようとしています。

4

1 に答える 1