显示不带父窗口的Gtk::FileChooserDialog
Show Gtk::FileChooserDialog without a parent window
我正在用OpenGL GUI编写一个应用程序。在Windows上,我使用GetOpenFilename
来允许用户选择一个文件。
我尝试在Linux上使用Gtk::FileChooserDialog
为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()
不包含特定于平台的代码。
我决定为此创建重载类。代码如下:
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";
相关文章:
- 如何在运行中期切换GTK CSS style_context
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 如何使用 GTK 3 正确设置默认文本
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 是否可以编译 Gtk+ 应用程序以同时在 Gtk 2 和 3 上运行
- GTK 最大化表单 C++
- GTK:完全摆脱系统主题/CSS
- GTK C++:找不到信号处理程序 您是否使用 -rdynamic 进行了编译?
- 如何从 Gtk::窗口调用派生对象的析构函数
- Gtk::带有set_icon_name的窗口图标集在 wayland 上不起作用
- GTK 3 C++按钮中带有标签的图标
- Gtkmm:创建一个Gtk::ComboBox,其中列出Gtk::DrawingArea
- 用GTK创建逻辑门模拟器,如何制作放置区域
- 使用 GTK 将 EGL 图像渲染到帧缓冲区
- 在 Win32 应用程序中承载 GTK+3 上下文
- 实时移动GTK+窗口
- 基于人脸检测坐标的GTK+移动窗口
- 如何在Visual Studio c++ for Linux平台中编写GTK应用程序
- Gtk+ 3 使用 OpenCV 编译时出错