Для отображения элементов файловой системы 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. В итоге при загрузке приложения оба представления отобразят содержимое текущей папки: