QTreeView模糊查询

        本文代码效果如下:

本文代码:

https://download.csdn.net/download/Sakuya__/89759410icon-default.png?t=O83Ahttps://download.csdn.net/download/Sakuya__/89759410


代码之路 

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStandardItemModel>
#include <QFileInfo>
#include <QDir>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void InitTreeView(QString path);

    bool GetAllFiles(QString path, QStandardItem *parentItem);

    void GetItem(QStandardItem *item);

    void ParentExpand(QStandardItem *item);

private slots:
    void on_Btn_Search_clicked();

private:
    Ui::MainWindow *ui;

    QStandardItemModel *m_treeViewModel;
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setWindowIcon(QIcon(":/Resouce/heart.ico"));

    // 设置树形结构
    m_treeViewModel = new QStandardItemModel(ui->treeView);
    m_treeViewModel->setHorizontalHeaderLabels(QStringList() << "文件名称" << "文件路径");
    ui->treeView->setModel(m_treeViewModel);
    ui->treeView->header()->setStretchLastSection(true);
    ui->treeView->hideColumn(1);
    ui->treeView->header()->hide();
    ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);

    InitTreeView("E:/MyWorkSpace/Qt/Demo");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::InitTreeView(QString path)
{
    QFileInfo fileInfo(path);
    if (!fileInfo.isDir())
    {
        return;
    }

    m_treeViewModel->removeRows(0, m_treeViewModel->rowCount());
    // 绑定文件夹的图标和文件路径
    QStandardItem *item = new QStandardItem(QIcon(":/Resouce/Folder.png"), path.split("/").last());
    m_treeViewModel->appendRow(item);
    m_treeViewModel->setItem(m_treeViewModel->indexFromItem(item).row(), 1, new QStandardItem(fileInfo.path()));

    GetAllFiles(path, item);
}

bool MainWindow::GetAllFiles(QString path, QStandardItem *parentItem)
{
    QDir sourceDir(path);
    // 文件按时间排序
    QStringList filter;
    sourceDir.setNameFilters(filter);
    QList<QFileInfo> fileInfoList = QList<QFileInfo>(sourceDir.entryInfoList(filter, QDir::AllEntries, QDir::Time));
    // 遍历当前文件夹下的文件列表
    foreach (QFileInfo fileInfo, fileInfoList)
    {
        if (fileInfo.fileName() == "." || fileInfo.fileName() == "..")
        {
            continue;
        }
        if (fileInfo.isDir())
        {
            // 如果存在子级,添加子级数据
            QStandardItem *item = new QStandardItem(QIcon(":/Resouce/Folder.png"), fileInfo.baseName());
            parentItem->appendRow(item);
            parentItem->setChild(item->row(), 1, new QStandardItem(fileInfo.filePath()));
            GetAllFiles(fileInfo.filePath(), item);
        }
        else if (fileInfo.isFile())
        {
            // 如果存在子级,添加子级数据
            QStandardItem *item = new QStandardItem(QIcon(":/Resouce/Document.png"), fileInfo.baseName());
            parentItem->appendRow(item);
            parentItem->setChild(item->row(), 1, new QStandardItem(fileInfo.filePath()));
        }
    }

    return true;
}

void MainWindow::GetItem(QStandardItem *item)
{
    Q_ASSERT(item);

    // 如果该行包含要查找的字符串,展开所有的父节点并把背景设为红色
    if (item->text().contains(ui->lineEdit->text()))
    {
        item->setBackground(QBrush(qRgb(255, 125, 125)));
        ParentExpand(item);
    }
    else
    {
        item->setBackground(QBrush(qRgb(255, 255, 255)));
    }

    // 如果有子项,继续查找所有子项
    if (item->hasChildren())
    {
        for (int i = 0; i < item->rowCount(); i++)
        {
            item->setSelectable(true);
            QStandardItem *childItem = item->child(i);
            GetItem(childItem);
        }
    }
}

void MainWindow::ParentExpand(QStandardItem *item)
{
    // 如果有父节点,就展开
    if (item->parent() != nullptr)
    {
        QStandardItem *parentItem = item->parent();
        ui->treeView->expand(parentItem->index());
        ParentExpand(parentItem);
    }
}

void MainWindow::on_Btn_Search_clicked()
{
    // 所有行全部折叠
    ui->treeView->collapseAll();

    if (!ui->lineEdit->text().isEmpty())
    {
        // 遍历查找所有行
        for (int i = 0; i < m_treeViewModel->rowCount(); i++)
        {
            GetItem(m_treeViewModel->item(i));
        }
    }
    else
    {
        for (int i = 0; i < m_treeViewModel->rowCount(); i++)
        {
            m_treeViewModel->item(i)->setBackground(QBrush(qRgb(255, 255, 255)));
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值