Я пытаюсь создать небольшое приложение, которое найдет, прочитает и экспортирует некоторые *. xml документы. Приложение должно прочитать иерархическую структуру папок и визуализировать ее в QTreeView на форме. Для лучшего управления я хочу, чтобы он расширял все объекты древовидной структуры при запуске приложения. Я пробовал много разных решений вроде этого:
void expandChildren(const QModelIndex &index, QTreeView *view)
{
if (!index.isValid())
{
return;
}
int childCount = index.model()->rowCount(index);
for (int i = 0; i < childCount; i++)
{
const QModelIndex &child = index.child(i, 0);
expandChildren(child, view);
}
if (!view->isExpanded(index))
{
view->expand(index);
}
}
с некоторых форумов и встраивал решения, такие как QTreeView :: expandRecursively и QTreeView :: expandAll, но я не достиг того, чего хотел.
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFileSystemModel>
#include <QDebug>
#include <QDirModel>
#include <QTreeView>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
QModelIndex fs_index;
QModelIndex child_1_index;
QModelIndex child_2_index;
QModelIndex child_3_index;
QFileSystemModel *fs_model = new QFileSystemModel;
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_treeView_clicked(const QModelIndex &index);
void on_pushButton_2_clicked();
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
void expandChildren(const QModelIndex &index, QTreeView *view)
{
if (!index.isValid())
{
return;
}
int childCount = index.model()->rowCount(index);
for (int i = 0; i < childCount; i++)
{
const QModelIndex &child = index.child(i, 0);
expandChildren(child, view);
}
if (!view->isExpanded(index))
{
view->expand(index);
}
}
};
#endif // MAINWINDOW_H
mainwindow. cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString str_root_path;
QDir dir;
qDebug() << "Current user's home folder is: " <<QDir::home().path();
str_root_path = QDir::home().path() + "/AppData/Local/app/settings";
qDebug() << "Settings storing folder id: " << str_root_path;
dir.setPath(str_root_path);
if (!dir.exists())
{
qDebug() << "Settings folder doesn't exist.";
return;
}
if (!dir.isReadable())
{
qDebug() << "Folder found. Read access denied. Check access rights.";
return;
}
qDebug() << "Folder found. Read access granted. Reading...";
ui->treeView->setModel(fs_model);
fs_index = fs_model->index(str_root_path);
qDebug() << fs_model->fileName(fs_index);
fs_model->setRootPath(str_root_path);
QStringList filter;
filter << "*.xml";
fs_model->setNameFilters(filter);
fs_model->setFilter( QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
ui->treeView->setRootIndex(fs_index);
ui->treeView->setCurrentIndex(fs_index);
for (int i = 1; i < fs_model->columnCount(); i++)
{
ui->treeView->setColumnHidden(i, true);
}
ui->treeView->show();
qDebug().nospace() << "View loaded. Expanding....";
ui->treeView->setExpanded(fs_index, true);
int fs_index_rows = fs_model->rowCount(fs_index);
qDebug().nospace() << "Number of found profiles:" << fs_index_rows;
for (int i = 0; i < fs_index_rows; ++i)
{
child_1_index = fs_model->index(i,0,fs_index);
ui->treeView->setExpanded(child_1_index, true);
int child_1_index_rows = fs_model->rowCount(child_1_index);
qDebug().nospace() << "Step #" << i+1 << " Object name: " << fs_model->fileName(child_1_index) << ". Num of children: " << child_1_index_rows;
for (int j = 0; j < child_1_index_rows; ++j)
{
child_2_index = ui->treeView->model()->index(j,0,child_1_index);
//qDebug() << child_2_index;
ui->treeView->setExpanded(child_2_index, true);
int child_2_index_rows = ui->treeView->model()->rowCount(child_2_index);
qDebug().nospace() << "Step #" << i+1 << "/" << j+1 << " Object name: " << fs_model->fileName(child_1_index) << "/" << fs_model->fileName(child_2_index) << ". Num of children: " << child_2_index_rows;
for (int k = 0; k < child_2_index_rows; ++k)
{
child_3_index = ui->treeView->model()->index(k,0,child_2_index);
ui->treeView->setExpanded(child_3_index, true);
int child_3_index_rows = ui->treeView->model()->rowCount(child_3_index);
qDebug().nospace() << "Step #" << i+1 << "/" << j+1 << "/" << k+1 << " Object name: " << fs_model->fileName(child_1_index) << "/" << fs_model->fileName(child_2_index) << "/" << fs_model->fileName(child_3_index) << ". Num of children: " << child_3_index_rows;
}
}
}
}
Если я вставлю этот код в слот, к которому подключен к сигналу «pushbutton_Clicked», например, каждый щелчок расширяет древовидное представление на еще один уровень глубины (то же действие появляется, если я подключаю QTreeView :: expandRecursively или QTreeView :: expandAll к «pushbutton_Clicked»). Я пытался отлаживать каждый шаг приложения и понимаю, что каждый новый индексный объект не может достичь родительского индекса файловой системы.
Пожалуйста, помогите мне понять, где находится ошибка и как ее исправить.
Я новичок в программировании на Qt, и мои знания не полны, но я все еще ищу, читаю и пытаюсь понять.
Заранее благодарю и извиняюсь за плохого Энгли sh.
Весь код приложения:
main. cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFileSystemModel>
#include <QDebug>
#include <QDirModel>
#include <QTreeView>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
QModelIndex fs_index;
QFileSystemModel fs_model;
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_treeView_clicked(const QModelIndex &index);
void on_pushButton_2_clicked();
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
void expandChildren(const QModelIndex &index, QTreeView *view)
{
if (!index.isValid()) {
return;
}
int childCount = index.model()->rowCount(index);
for (int i = 0; i < childCount; i++) {
const QModelIndex &child = index.child(i, 0);
// Recursively call the function for each child node.
expandChildren(child, view);
}
if (!view->isExpanded(index))
{
view->expand(index);
}
}
void expand_the_tree(const QModelIndex &root_index, QTreeView *view)
{
qDebug() << fs_model.canFetchMore(root_index);
while (fs_model.canFetchMore(root_index) == true)
{
fs_model.fetchMore(root_index);
}
qDebug().nospace() << "Model fetched on root layer.";
QModelIndex child_1_index;
QModelIndex child_2_index;
QModelIndex child_3_index;
view->expand(root_index);
int root_index_rows = fs_model.rowCount(root_index);
qDebug().nospace() << "Number of found profiles:" << root_index_rows;
for (int i = 0; i < root_index_rows; ++i)
{
child_1_index = fs_model.index(i,0,root_index);
view->expand(child_1_index);
expandChildren(child_1_index, view);
int child_1_index_rows = fs_model.rowCount(child_1_index);
qDebug().nospace() << "Step #" << i+1 << " Object name: " << fs_model.fileName(child_1_index) << ". Num of children: " << child_1_index_rows;
for (int j = 0; j < child_1_index_rows; ++j)
{
child_2_index = fs_model.index(j,0,child_1_index);
//qDebug() << child_2_index;
view->expand(child_2_index);
int child_2_index_rows = fs_model.rowCount(child_2_index);
qDebug().nospace() << "Step #" << i+1 << "/" << j+1 << " Object name: " << fs_model.fileName(child_1_index) << "/" << fs_model.fileName(child_2_index) << ". Num of children: " << child_2_index_rows;
for (int k = 0; k < child_2_index_rows; ++k)
{
child_3_index = fs_model.index(k,0,child_2_index);
view->expand(child_3_index);
int child_3_index_rows = fs_model.rowCount(child_3_index);
qDebug().nospace() << "Step #" << i+1 << "/" << j+1 << "/" << k+1 << " Object name: " << fs_model.fileName(child_1_index) << "/" << fs_model.fileName(child_2_index) << "/" << fs_model.fileName(child_3_index) << ". Num of children: " << child_3_index_rows;
}
}
}
}
};
#endif // MAINWINDOW_H
основное окно. cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString str_root_path;
QDir dir;
qDebug() << "Current user's home folder is: " <<QDir::home().path();
str_root_path = QDir::home().path() + "/AppData/Local/app/settings";
qDebug() << "Preset's storing folder id: " << str_root_path;
dir.setPath(str_root_path);
if (!dir.exists())
{
qDebug() << "Settings folder doesn't exist.";
return;
}
if (!dir.isReadable())
{
qDebug() << "Folder found. Read access denied. Check access rights.";
return;
}
qDebug() << "Folder found. Read access granted. Reading...";
fs_index = fs_model.index(str_root_path);
qDebug() << fs_model.fileName(fs_index);
fs_model.setRootPath(str_root_path);
QStringList filter;
filter << "*.xml";
fs_model.setNameFilters(filter);
fs_model.setFilter( QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot);
ui->treeView->setModel(&fs_model);
ui->treeView->setRootIndex(fs_index);
ui->treeView->setCurrentIndex(fs_index);
qDebug() << fs_model.canFetchMore(fs_index);
for (int c = 1; c < fs_model.columnCount(); c++)
{
ui->treeView->setColumnHidden(c, true);
}
qDebug().nospace() << "View loaded. Expanding....";
expand_the_tree(fs_index, ui->treeView);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
qDebug() << index;
}
void MainWindow::on_pushButton_2_clicked()
{
expandChildren(fs_index, ui->treeView);
}
void MainWindow::on_pushButton_clicked()
{
expand_the_tree(fs_index, ui->treeView);
}
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>712</width>
<height>635</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QTreeView" name="treeView">
<property name="geometry">
<rect>
<x>20</x>
<y>60</y>
<width>311</width>
<height>531</height>
</rect>
</property>
</widget>
<widget class="QTableView" name="tableView">
<property name="geometry">
<rect>
<x>370</x>
<y>60</y>
<width>321</width>
<height>531</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>20</x>
<y>600</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Refresh</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>110</x>
<y>600</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Retreve all</string>
</property>
</widget>
</widget>
</widget>
<resources/>
<connections/>
</ui>