gtkmm4文件浏览对话框

文章目录

  • 前言
  • 使用 Gtk::FileChooserNative
  • Gtk::FileDialog
  • gtkmm3 使用 Gtk::FileChooserDialog
  • 继承Gtk::FileChooserWidget

前言

  • 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

  • // 创建一个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风格

继承Gtk::FileChooserWidget

  • 没有尝试

你可能感兴趣的:(GTK,gtkmm,文件对话框)