retireSakiの日記

たぶん引退した?ソフトウエアエンジニアのブログ

GTKmm (3.0) と glade によるアプリ (11) - ファイル選択ダイアログ

 今回は、前回の" GTKmm (3.0) と glade によるアプリ (10) - プログレスバーと2つのモード "で作成したプログラムを使って、ファイル選択ダイアログでファイルを選択できるようにしてみたいと思います。

retiresaki.hatenablog.com

f:id:retireSaki:20181114143204j:plain

ファイルを選択した結果はこんな感じで、呼び出し元のウィンドウに表示されます。

f:id:retireSaki:20181114143220j:plain

 glade を使ったプログラムも用意しようと思いましたが。結果的に直接呼び出したものより、ソースコードが大きくなったこと、現時点でgladeでタイトルバー(ヘッダーバー)にボタンがついているダイアログを使うと、ワーニング(?)を出力する仕様(?)になっていることを考慮して、今回は、gladeを使ったものは掲載しないことにしました。

 以前にも、「GTKmm の FileChooserDialog をただ表示するアプリ」で、FileChooserDialog を紹介しましたが、

retiresaki.hatenablog.com

今回は、フィルター機能も追加しています。

ソースコードは最後に両方の機能を含めたものを公開。(zipダウンロードできます)


 gladeに新しく "file select" ボタンを追加し、クリックイベントで FileChooserDialog を使っている on_btnfileselect() を呼び出しています。

 glade にボタン追加したり、ソースコードのクリックイベント処理などについての云々かんぬんはもう良いでしょう。

 関数 on_btnfileselect() のソース


● Child_Window.cc

void Child_Window::on_btnfileselect()
{
    // don't use glade
    Gtk::FileChooserDialog dialog( *this, "open file", Gtk::FILE_CHOOSER_ACTION_OPEN );

    dialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK);
    dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);

    auto filter_cpp = Gtk::FileFilter::create();
    filter_cpp->set_name("C/C++ files");
    filter_cpp->add_mime_type("text/x-c");
    filter_cpp->add_mime_type("text/x-c++");
    filter_cpp->add_mime_type("text/x-c-header");
    dialog.add_filter(filter_cpp);

    auto filter_all = Gtk::FileFilter::create();
    filter_all->set_name("all files");
    filter_all->add_pattern("*.*");
    dialog.add_filter(filter_all);

    switch( dialog.run() ){

        case Gtk::RESPONSE_OK:
            m_labeldisp1->set_text("GTK::FileChooserDialog\n"+dialog.get_filename());
            break;

        case Gtk::RESPONSE_CANCEL:
            m_labeldisp1->set_text("GTK::FileChooserDialog\nCANCEL");
            break;
    }

}

(1) Gtk::FileChooserDialog で dialog を作成

  Gtk::FileChooserDialog::FileChooserDialog (
    Gtk::Window& parent,
    const Glib::ustring & title,
    FileChooserAction action = FILE_CHOOSER_ACTION_OPEN
  )

 parent は親となる widget を指定。
 title はダイアログのタイトルバーに表示する文字列を指定。
 action は以下の4種類があります。特に説明の必要はないでしょう。
  FILE_CHOOSER_ACTION_OPEN
  FILE_CHOOSER_ACTION_SAVE
  FILE_CHOOSER_ACTION_SELECT_FOLDER
  FILE_CHOOSER_ACTION_CREATE_FOLDER

(2) レスポンス用のボタンを指定

 add_button() を使って、OPEN と CACEL を設定。

  Button* Gtk::Dialog::add_button ( 
    const Gtk::StockID& stock_id,
    int response_id
  )

 stock_id はストックしているボタンIDを指定。
  ビルトインボタンの中から関連しそうな ID
   OPEN , CANCEL , SAVE , SAVE_AS , CLOSE , NEW など

 response_id はダイアログの応答ID(リターン値)を指定。
  標準的な response ID
   RESPONSE_NONE , RESPONSE_REJECT , RESPONSE_ACCEPT , RESPONSE_DELETE_EVENT , RESPONSE_OK , RESPONSE_CANCEL , RESPONSE_CLOSE , RESPONSE_YES , RESPONSE_NO , RESPONSE_APPLY , RESPONSE_HELP

(3) フィルターなどの設定

 一覧表示されるファイルを指定した拡張子(mime-type)またはパターンで絞りこむフィルターを設定します。

  static Glib::RefPtr Gtk::FileFilter::create ();
 でフィルターを作成し、フィルター名を設定、
  void Gtk::FileFilter::set_name ( const Glib::ustring & name );
 mime-type または パターンを指定します。
  void Gtk::FileFilter::add_mime_type ( const Glib::ustring & mime_type );
  void Gtk::FileFilter::add_pattern ( const Glib::ustring & pattern );

 最後に FileChooser に作成したフィルターを追加します。
  void Gtk::FileChooser::add_filter ( const Glib::RefPtr< FileFilter >& filter );

 フィルターが設定されていない場合、ダイアログにはフィルター選択ドロップダウンリストは表示されません。

 表示したいファイルのmime-typeが不明な場合、file コマンドを使うと mime-type を表示できます。
  $ file -i MainWindow.cc
  MainWindow.cc: text/x-c++; charset=us-ascii

 まは、Ubuntu であれば、/usr/share/mime/globs2 などで一覧をみることもできます。

 パターン指定では、、ワイルドカードでファイル名のセットを指定するパターンを指定します。
  "*.txt" など。

(4) 選択されたファイル名などを取得

 フィルターなどを設定したら、run() で表示し、ユーザーの選択結果を待ちます。
 FileChooserDialog のリターン値は通常のダイアログと同じです。

 ユーザーが選択ファイルやパスを取得する場合、以下の関数などを使います。
  std::string Gtk::FileChooser::get_filename ( ) const
  std::vector Gtk::FileChooser::get_filenames ( ) const
  Glib::RefPtr Gtk::FileChooser::get_file ( )
  Glib::RefPtr Gtk::FileChooser::get_file ( ) const

 エンコーディングなどが必要な場合は、以下の関数を使うと良いです。
  Glib::ustring Gtk::FileChooser::get_uri ( ) const
  std::vector Gtk::FileChooser::get_uris ( ) const

Gtk::FileChooserDialog は、初期表示指定など基本的なことは当然できますが、記述しきれないほど複雑なことができますので、マニュアル等を熟読すると良いでしょう。
Qtより細かいことがやり易いです。


以上、簡単でしたね!
devhelp などを使い、Gtk::FileChooserDialog のクラスリファレンスを開けば、クラスの相関図が表示されているので、そこから追跡すると良いでしょう。


最後に、全てのファイルを圧縮したファイル(zip)を載せます。

●ソース一式

www.mediafire.com

GTKプログラミングを学習するなら!

Gtk+3入門

Gtk+3入門

GTK+・GDKによるLinuxアプリケーション開発 (New riders)

GTK+・GDKによるLinuxアプリケーション開発 (New riders)

Learn GTK# Programming

Learn GTK# Programming

注目記事

「Amazon.co.jpアソシエイト」または「[乙の名称を挿入]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。