QTreeViewを使った簡易的なファイルエクスプローラーの作り方
階層構造を持ち、フォルダを参照できるようなファイルエクスプローラーを作りたい場合、QTreeViewとQFileSystemModelを組み合わせれば、簡易的ですが実現できます。
ここではその手順をまとめたいと思います。
QFileSystemModelの拡張
まず初めにファイルシステムにアクセスするためのモデルクラスをQFileSystemModelを拡張して作ります。
class FileExplorerModel : public QFileSystemModel { public: FileExplorerModel(QObject* parent = 0) : QFileSystemModel(parent) {} };
単純なエクスプローラーを作るだけなら拡張する必要はありませんがここでは将来の拡張性のためにあえてQFileSystemModelを拡張したクラスを作っています。
QTreeViewの拡張
次にエクスプローラーのGUI部分を作ります。
ここではFileExplorerという名前でQTreeViewを拡張して次のようなクラスを宣言しました。
#ifndef FILEEXPLORER_H #define FILEEXPLORER_H #include "FileExplorerModel.h" #include <QTreeView> class FileExplorer : public QTreeView { public: FileExplorer(QWidget * parent = 0) : QTreeView(parent) {} void setRootPath(const QString & path); QString currentRootPath(){ return rootPath; } private: QString rootPath; /// ルートフォルダのパス }; #endif // FILEEXPLORER_H
setRootPathがエクスプローラーのルートフォルダを設定する関数で次のような定義をしました。
void FileExplorer::setRootPath(const QString &path) { FileExplorerModel * treeModel = new FileExplorerModel; QModelIndex rootModelIndex = treeModel->setRootPath(path); this->rootPath = path; ///現在のルートパスを保存 setHeaderHidden(true); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setTextElideMode(Qt::ElideNone); setModel(treeModel); setRootIndex(rootModelIndex); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setFixedHeight(500); setColumnWidth(0, INT_MAX); }
使ってみる
これで簡易的なエクスプローラーができたので次のように実行してみます。
int main(int argc, char *argv[]) { QApplication a(argc, argv); FileExplorer explorer; explorer.setRootPath("C:/Program Files/"); explorer.show(); return a.exec(); }
結果的には次のようなファイルエクスプローラーが表示されます。
とても簡易的ですが、フォルダ展開も出来ます。あとはダブルクリックしたらファイルを開くなどの動作を追加すればよりファイルエクスプローラーらしく(?)なります。
© Kaz