Qt QFileDialog のサイドバー表示フォルダーをGTKのbookmarksを使って、ほぼ同じようにするサンプルコード
QtのQFileDialogは、どうしようもなく使いづらいく、エンドユーザーも含めて不評です。
その原因も一つがサイドバーです。
そこで、GTKを使ったデスクトップ環境限定ですが、QtのQFileDialogのサイドバーをGTK環境のオープンファイルダイアログに近い状態にするサンプルコードを作りました。
あくまでも私の環境のUbuntuでのテストコードなので、Windowsなど他のOSなどでは若干の手直しが必要になるかもしれません。
また、このアプリの作成途中でテストしたので、ソースファイル等は公開しませんので、ご了承ください。
※リンク忘れで追加 (2019/03/03 13:59)
サンプルコード
sample.cpp
QString MainWindow::getOpenFilename() { QFileDialog dlgfile(this); dlgfile.setOptions(QFileDialog::ReadOnly|QFileDialog::DontUseNativeDialog); dlgfile.setWindowTitle(tr("Open File")); dlgfile.setDirectory(init_path); dlgfile.setNameFilter(tr("ALL file (*.*)")); QSize size=dlgfile.size(); dlgfile.resize(820,size.height()); QList<QUrl> urls = getGTKbookmarks(); if (urls.length() > 0){ dlgfile.setSidebarUrls(urls); } int nrtn = dlgfile.exec(); if (nrtn == 0){ return ""; } return dlgfile.selectedFiles()[0]; } QList<QUrl> MainWindow::getGTKbookmarks() { QList<QUrl> urls; urls.clear(); QString dirPath = QStandardPaths::standardLocations(QStandardPaths::ConfigLocation)[0]; QStringList nameFilters; nameFilters << "bookmarks"; QDir::Filters filters = QDir::Files; QDirIterator::IteratorFlags flags = QDirIterator::Subdirectories; QDirIterator it(dirPath, nameFilters, filters, flags); QStringList files; while (it.hasNext()) { QString file = it.next(); if (file.indexOf("gtk") >= 0){ files << file; qDebug() << file; break; } } QStringList list; QFile file(files[0]); if (file.open(QIODevice::ReadOnly)) { QTextStream in(&file); while (!in.atEnd()) { QString str = in.readLine().trimmed(); //qDebug() << in.readLine(); if (str.length() > 0) list << str; } file.close(); } urls << QUrl("file://"+QStandardPaths::standardLocations (QStandardPaths::HomeLocation)[0]); urls << QUrl("file://"+QStandardPaths::standardLocations (QStandardPaths::DesktopLocation)[0]); for (int ni = list.length()-1;ni > list.length()-6;ni--){ QStringList list2 = list[ni].split(" "); urls << QUrl(list2[0]); } for (int ni = 0;ni < list.length()-5;ni++){ QStringList list2 = list[ni].split(" "); urls << QUrl(list2[0]); } return urls; }
解説
nautilusなどのGTK環境のファイルマネージャーの多くは、
Ubuntu 場合:"home/.config/gtk-3.0/bookmarks"
に保存されます。
また、booknarksの中は、
file://〜
というように、URL形式で保存されます。
これには、初期標準で表示されるフォルダーも含まれています。
これを解析したところで、
・前半部分はユーザーが追加したブックマークフォルダーが並び順
・後半部分は初期標準で設定されたブックマークフォルダーが逆の並び順
となっていました。
この辺りに関する処理がこのサンプルコードを不確定とする部分で、修正しなければならない箇所になると思います。
これらの情報を元に、
(1) QDirIterator を使って、GTKのbookmarksファイルを探します。
(2) QFileDialog の setSidebarUrls は QList<QUrl> で設定するため、
(2.1) bookmarksの後半部分をファイルを降順に読み出す
(2.2) bookmarksの前半部分をファイルを昇順に読み出す
ということをしています。
(3) 取得した QList<QUrl> を QFileDialog の setSidebarUrls で設定します。
これで、ほぼ GTK のファイルダイアログに近い状態にすることができました。
Qtの QFileDialog がもっとしっかり作ってあれば、こんなことしなくても済むのですが...(^^ゞ
- 作者: 増田智明
- 出版社/メーカー: 秀和システム
- 発売日: 2018/03/27
- メディア: 単行本
- この商品を含むブログを見る
Qtプログラミング入門―使いやすいフレームワークを基礎から解説 (I・O BOOKS)
- 作者: 津田伸秀
- 出版社/メーカー: 工学社
- 発売日: 2011/12/01
- メディア: 単行本
- 購入: 1人 クリック: 4回
- この商品を含むブログ (9件) を見る
- 作者: ダニエルソーリン,Daniel Solin,アットコム
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2001/05
- メディア: 単行本
- 購入: 1人 クリック: 9回
- この商品を含むブログ (2件) を見る
- 作者: ToshioCP
- 発売日: 2017/06/06
- メディア: Kindle版
- この商品を含むブログを見る
GTK+とGladeで作るLinuxプログラミング超入門―かっこいいアプリを自分で作ろう! (CompuBooks)
- 作者: 鈴木哲哉
- 出版社/メーカー: すばる舎
- 発売日: 2000/06
- メディア: 単行本
- クリック: 25回
- この商品を含むブログ (1件) を見る