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()
、プラットフォーム固有のコードを排除しようとしています。