我正在编写一个带有 OpenGL GUI 的应用程序。在 Windows 上,我GetOpenFilename
用来允许用户选择一个文件。
Gtk::FileChooserDialog
我尝试使用(遵循本教程)在 Linux for Gtk 上实现类似的功能。我试图保持 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()
平台的代码。