目录
前言
- gtkmm4 弃用了Gtk::FileChooserDialog 而引进了Gtk::FileDialog
- 有几点需求和问题:
- 我需要选择文件夹的对话框能连文件一起显示
- gtkmm4 依然能使用 Gtk::FileChooserNative
- 用本土的文件浏览对话框 还是 GTK 的
- gtkmm3 使用Gtk::FileChooserDialog 能满足第一个需求吗
使用 Gtk::FileChooserNative
// 创建一个FileChooserNative
auto dialog = Gtk::FileChooserNative::create("Please choose a folder",
*this,
Gtk::FileChooser::Action::SELECT_FOLDER,
"Choose",
"Cancel");
// dialog->set_transient_for(*this);
//
// // 创建一个过滤器
auto filters = Gio::ListStore<Gtk::FileFilter>::create();
auto filter_text = Gtk::FileFilter::create();
filter_text->set_name("Any files");
// filter_text->add_mime_type("any/any");
filter_text->add_pattern("*");
filters->append(filter_text);
dialog->add_filter(filter_text);
// dialog->set_filter(filter_tex
// 运行对话框
dialog->show();
- 意思是调用原生的对话框
>.我是在winodws上开发Gtk应用,所以它提供windows风格的文件对话框
- 但是如果行为是
Gtk::FileChooser::Action::SELECT_FOLDER
时, 上面的过滤器就不起效果, 对话框中也不会显示过滤下拉菜单选项, 也只显示文件夹
Gtk::FileDialog
- 官网例子: https://gnome.pages.gitlab.gnome.org/gtkmm-documentation/sec-dialogs-filedialog.html
官网例子很简单,一个文件选择(带过滤器), 一个文件夹选择(不显示文件,无过滤器,默认使用本土风格的文件对话框) - 我尝试在它select_folder(文件夹选择)的情况下给它加过滤器,希望它能显示文件, 于是发现了下面的 "特性"
能达到我上面的需求:auto dialog = Gtk::FileDialog::create(); auto filters = Gio::ListStore<Gtk::FileFilter>::create(); auto filter_text = Gtk::FileFilter::create(); filter_text->set_name("Any files"); filter_text->add_mime_type("some mime_type balabala"); filter_text->add_pattern("*"); filters->append(filter_text); dialog->set_filters(filters); // Show the dialog and wait for a user response: dialog->select_folder(sigc::bind(sigc::mem_fun( *this, &ExampleWindow::on_folder_dialog_finish), dialog));
选择文件夹的对话框能连文件一起显示
是GTK风格的文件浏览对话框
但如果注释掉add_mime_type这一行, 那么显示本土风格的对话框,而且就和上面FileChooserNative一样达不到需求
gtkmm3 使用 Gtk::FileChooserDialog
-
能达到要求, GTK风格// 创建一个FileChooserDialog Gtk::FileChooserDialog dialog("Please choose a folder or file", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); // 添加“打开”按钮 dialog.add_button("_Open", Gtk::RESPONSE_ACCEPT); // 添加“取消”按钮 dialog.add_button("_Cancel", Gtk::RESPONSE_CANCEL); // 设置对话框的标题 dialog.set_title("Select Folder or File"); // 设置对话框的默认文件夹 // dialog.set_current_folder("/path/to/default/folder"); // 设置是否显示文件 dialog.set_show_hidden(true); // 显示隐藏文件 auto filter_text = Gtk::FileFilter::create(); filter_text->set_name("Any files"); filter_text->add_mime_type("text/plain"); filter_text->add_pattern("*"); dialog.set_filter(filter_text); // 不使用过滤器,显示所有文件 dialog.set_transient_for(*this); //Add response buttons the the dialog: dialog.add_button("_Cancel", Gtk::RESPONSE_CANCEL); dialog.add_button("Select", Gtk::RESPONSE_OK); int result = dialog.run(); //Handle the response: switch(result) { case(Gtk::RESPONSE_OK): { std::cout << "Select clicked." << std::endl; std::cout << "Folder selected: " << dialog.get_filename() << std::endl; break; } case(Gtk::RESPONSE_CANCEL): { std::cout << "Cancel clicked." << std::endl; break; } default: { std::cout << "Unexpected button clicked." << std::endl; break; } }
继承Gtk::FileChooserWidget
- 没有尝试