我正在使用OpenGL GUI编写应用程序。在Windows上,我使用GetOpenFilename
来允许用户选择文件。
我尝试使用Gtk::FileChooserDialog
(在this tutorial之后)在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()
不受特定于平台的代码的限制。
答案 0 :(得分:2)
我决定为此创建重载类。代码如下:
class FileChooser : public Gtk::FileChooserDialog {
public:
static std::string getFileName() {
FileChooser dialog("Select file", Gtk::FILE_CHOOSER_ACTION_OPEN);
kit.run(dialog);
std::string ret = dialog.chosenFile;
return ret;
}
protected:
static Gtk::Main kit;
std::string chosenFile;
FileChooser(const Glib::ustring& title, Gtk::FileChooserAction action = Gtk::FILE_CHOOSER_ACTION_OPEN) :
Gtk::FileChooserDialog(title, action) {
chosenFile = std::string("");
add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK);
signal_response().connect(sigc::mem_fun(*this,
&FileChooser::on_my_response));
}
void on_my_response(int response_id) {
chosenFile = get_filename();
hide();
}
};
Gtk::Main FileChooser::kit(false);
你可以像这样使用它:
std::cout << "File: " << FileChooser::getFileName() << "\n";