QT实现指定目录下模糊查询

资源树模糊查询实现

Demo实现的功能

1.可以获取指定目录下的资源树;(eg: C:/Qt)

2.可以过滤显示资源树上包含关键字的资源;

3.输入关键字后,按回车键即可搜索匹配资源;

Demo实现的效果

实现模糊查询的关键元素

本Demo实现,使用的是Qt中的QTreeView,QFileSystemModel,QSortFilterProxyModel三个控件结合来完成模糊查询的功能的。

主界面初始化函数实现

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent) {
    // 设置主窗口
    QWidget *centralWidget = new QWidget(this);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);

    // 创建文件系统模型
    fileModel = new QFileSystemModel(this);
    QDir::setCurrent("D:/");
    fileModel->setRootPath(QDir::currentPath());
    fileModel->setFilter(QDir::Dirs| QDir::Files | QDir::NoDotAndDotDot);


    // 创建代理模型实现模糊过滤
    proxyModel = new FilterProxyModel();

    connect(fileModel, &QFileSystemModel::directoryLoaded,
            [=]{ proxyModel->invalidate(); });

    // 创建树视图
    treeView = new QTreeView(this);
    treeView->setModel(fileModel);
    treeView->setRootIndex(fileModel->index(QDir::currentPath()));
    treeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);

    // 创建搜索框
    initSearchBar();

    // 布局
    layout->addWidget(m_search);
    layout->addWidget(treeView);
    centralWidget->setLayout(layout);
    setCentralWidget(centralWidget);
    resize(800, 600);
}

继承QSortFilterProxyModel函数实现

        由于QSortFilterProxyModel模型默认不支持递归匹配,所以需要实现一个可以递归匹配的自定义模型。

class FilterProxyModel : public QSortFilterProxyModel {
protected:
    bool filterAcceptsRow(int row, const QModelIndex &parent) const override {

        // 1. 检查当前节点是否匹配
        const QModelIndex idx = sourceModel()->index(row, 0, parent);
        if (idx.isValid()) {
            const QString text = sourceModel()->data(idx).toString();
            if (text.contains(filterRegExp()))
                return true;
        }

        // 2. 递归检查子节点(即使父节点未展开也强制检查)
        const int childCount = sourceModel()->rowCount(idx);
        for (int i = 0; i < childCount; ++i) {
            if (filterAcceptsRow(i, idx))
                return true;
        }

        return false;
    }
};

实现模糊查询的拓展应用

在Qt中还可以实现自定义目录树,自定义列表的模糊查询操作。

自定义目录树的模糊查询可结合QTreeView ,QStandardItemModel,QSortFilterProxyModel三者实现;

自定义列表的模糊查询可结合QTableView ,QStandardItemModel,QSortFilterProxyModel三者实现。

Demo资源

https://download.csdn.net/download/kk821521286/90955654?spm=1001.2014.3001.5503

你可能感兴趣的:(Qt,qt,模糊查询)