Для отображения элементов файловой системы Qt предоставляет встроенный класс модели QFileSystemModel. Файловую систему можно представить в виде списка - файлов и папок, которые есть в определенной папке/на жестком диске, либо в виде дерева каталогов, где каждый каталог содержит файлы и другие каталоги. Для обоих представлений Qt предоставляет встроенные классы QListView (отображение в виде списка) и QTreeView (отображение в виде дерева). Используем оба представления для вывода файлов/каталогов из определенной папке. Для этого возьмем проект по типу Qt Widgets Application (то есть проект виджетов) и определим в файле main.cpp следующий код:
#include <QApplication> #include <QWidget> #include <QHBoxLayout> #include <QListView> #include <QTreeView> #include <QFileSystemModel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget* widget = new QWidget; widget->setWindowTitle("METANIT.COM"); widget->setMinimumHeight(180); widget->setMinimumWidth(300); widget->setContentsMargins(1,1,1,1); QListView *listView = new QListView(); // для списка QTreeView *treeView = new QTreeView(); // для дерева // контейнер для расположения виджетов в ряд по горизонтали QHBoxLayout *layout = new QHBoxLayout(widget); // добавляем виджеты в контейнер layout->addWidget(listView); layout->addWidget(treeView); // модель файловой системы QFileSystemModel *model = new QFileSystemModel; // устанавливаем корневую папку model->setRootPath(QDir::currentPath()); // устанавливаем модель для древовидного представления treeView->setModel(model); // устанавливаем корневой элемент treeView->setRootIndex(model->index(QDir::currentPath())); // устанавливаем модель для представления списка listView->setModel(model); // устанавливаем корневой элемент listView->setRootIndex(model->index(QDir::currentPath())); widget->show(); return a.exec(); }
Итак, для создания интерфейса наподобие классического проводника здесь применяется компонент компоновки QHBoxLayout, который располагает QListView и QTreeView рядом друг с другом.
Вначале создаем объект QFileSystemModel
QFileSystemModel *model = new QFileSystemModel
С помощью функции setRootPath() устанавливаем для модели корневую папку, содержимое которой будет отображаться в обоих виджетах
model->setRootPath(QDir::currentPath());
Функция QDir::currentPath()
возвращает текущую папку (то есть папку проекта).
Далее устанавливаем модель для древовидного представления:
treeView->setModel(model);
Затем с помощью метода setRootIndex()
устанавливаем корневой элемент для treeView. Для этого применяется индекс элемента модели, который соответствует корневой папке:
treeView->setRootIndex(model->index(QDir::currentPath()));
Аналогичные действия выполняем для listView. В итоге при загрузке приложения оба представления отобразят содержимое текущей папки: