QT可视化开发:如何实现目录树以及显示表格?

QT开发
我现在需要实现如下图所示图形界面。
具体要求:
1. 左侧自动读入电脑的所有文件目录,用户点击目录可以逐级选择子目录。最上层目录是C盘、D盘、E盘。
2. 如果选中的子目录中包含后缀为.HDB的文本文件,就读取子目录中的所有HDB文件,逐个打开HDB文件,读取文件的相关信息,然后以一行的形式显示在右侧的表格中。
3. 读取文件信息的功能在源程序的主函数中已经实现,现在我的主要问题是不知道怎么实现QT的可视化。

img

要在Qt中实现目录树,您可以使用QTreeView和QFileSystemModel类。下面是一个简单的示例代码,可以将当前目录的文件和文件夹显示在目录树中:

#include <QApplication>
#include <QTreeView>
#include <QFileSystemModel>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 创建一个QFileSystemModel对象,设置根路径为当前目录
    QFileSystemModel model;
    model.setRootPath(QDir::currentPath());
    // 创建一个QTreeView对象,并将QFileSystemModel对象设置为其模型
    QTreeView treeView;
    treeView.setModel(&model);
    // 将目录树设置为可编辑
    treeView.setEditTriggers(QAbstractItemView::NoEditTriggers);
    // 显示目录树
    treeView.show();
    return a.exec();
}

这个示例代码创建了一个QFileSystemModel对象,并将其设置为QTreeView的模型。在创建QFileSystemModel对象时,我们将根路径设置为当前目录。这将导致QFileSystemModel对象显示当前目录下的所有文件和文件夹。最后,我们将QTreeView对象设置为不可编辑,并将其显示在屏幕上。
您可以根据需要修改QFileSystemModel和QTreeView的属性以满足您的需求。例如,您可以使用QFileSystemModel的setFilter方法来过滤显示的文件类型。

表格可以使用QTableView实现;
也可以看这里https://blog.csdn.net/qq_43627907/article/details/125677496



```c++
cpp
#include <QApplication>
#include <QTreeView>
#include <QStandardItemModel>
#include <QFileSystemModel>
#include <QVBoxLayout>
#include <QTableView>
#include <QStandardItem>
#include <QDir>
#include <QStringList>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 创建左侧目录树视图
    QTreeView* treeView = new QTreeView;
    QFileSystemModel* fileModel = new QFileSystemModel(treeView);
    fileModel->setRootPath(QDir::rootPath());  // 设置根路径为C盘、D盘、E盘等
    treeView->setModel(fileModel);
    treeView->setRootIndex(fileModel->index(QDir::rootPath()));  // 显示根目录

    // 创建右侧表格视图
    QTableView* tableView = new QTableView;
    QStandardItemModel* tableModel = new QStandardItemModel(tableView);
    tableModel->setColumnCount(3);  // 表格有三列:文件名、文件大小、文件类型
    QStringList headers = {"文件名", "文件大小", "文件类型"};
    tableModel->setHorizontalHeaderLabels(headers);  // 设置表头
    tableView->setModel(tableModel);

    // 连接左侧目录树视图和右侧表格视图
    QObject::connect(treeView, &QTreeView::clicked, [=](const QModelIndex& index) {
        QString path = fileModel->filePath(index);  // 获取当前目录路径
        QDir dir(path);
        QStringList filter;
        filter << "*.HDB";  // 过滤后缀为.HDB的文件
        QFileInfoList fileList = dir.entryInfoList(filter, QDir::Files | QDir::NoSymLinks);  // 获取目录中所有符合条件的文件列表
        tableModel->removeRows(0, tableModel->rowCount());  // 先清空表格数据
        foreach(QFileInfo fileInfo, fileList) {
            QList<QStandardItem*> rowItems;
            rowItems.append(new QStandardItem(fileInfo.fileName()));  // 文件名
            rowItems.append(new QStandardItem(QString::number(fileInfo.size())));  // 文件大小
            rowItems.append(new QStandardItem(fileInfo.suffix()));  // 文件类型
            tableModel->appendRow(rowItems);  // 添加一行表格数据
        }
    });

    // 创建主窗口并布局
    QWidget* mainWidget = new QWidget;
    QVBoxLayout* mainLayout = new QVBoxLayout(mainWidget);
    mainLayout->addWidget(treeView);
    mainLayout->addWidget(tableView);
    mainWidget->show();

    return a.exec();
}
这段代码中,我们首先创建了一个左侧的目录树视图 QTreeView 和一个右侧的表格视图 QTableView。通过 QFileSystemModel 类来实现目录树视图的自动读入电脑的所有文件目录,并且支持逐级选择子目录。通过 QStandardItemModel 类来实现表格视图的数据模型,以及支持根据选中的子目录中包含的.HDB文件读取相关信息并在表格中一行一行的显示。

在连接左侧目录树视图和右侧表格视图时,我们通过 QObject::connect 函数来实现点击目录树视图中的子目录时,获取当前目录路径,并基于该路径获取子目录中符合条件的.HDB文件列表。然后根据列表中每个文件的文件名、文件大小和文件类型创建一个 QStandardItem 对象,将这些 QStandardItem 对象添加到 QStandardItemModel 中,并更新表格视图显示。

需要注意的是,这只是一个示例代码,实际应用中需要根据具体需求进行适当修改和扩展。

```

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^