Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实(下)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实(下)相关的知识,希望对你有一定的参考价值。

3、自定义排序

    // 表头排序指示器
    ui->filesTable->setSortingEnabled(true); // 允许排序
    ui->filesTable->horizontalHeader()->setSortIndicatorShown(true); // 显示排序指示器

具体实现:

void MainWindow::createFilesTable()

    ui->filesTable = new QTableWidget(0,3);
    ui->filesTable->setSelectionBehavior(QAbstractItemView::SelectRows);

    QStringList labels;
    labels << tr("Filename") <<tr("Path")<< tr("Size");
    ui->filesTable->setHorizontalHeaderLabels(labels);
    ui->filesTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
    ui->filesTable->verticalHeader()->hide();
    ui->filesTable->setShowGrid(false);

    // 表头排序指示器
//    ui->filesTable->setSortingEnabled(true); // 允许排序
//    ui->filesTable->horizontalHeader()->setSortIndicatorShown(true); // 显示排序指示器


    // 菜单
    ui->filesTable->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->filesTable, &QTableWidget::customContextMenuRequested,
                this, &MainWindow::contextMenu);
    connect(ui->filesTable, &QTableWidget::cellActivated,
                this, &MainWindow::openFileOfItem);


不过有点问题:

因为size字段带了单位后是字符,字符的大小比较会有点问题,因此在实现中先关闭。

解决办法

1、通过文本排序QTextListFormatstyleindex进行排序。

2、lamb表达式对排序规则进行自定义。

4、文件图标获取

 QIcon icon = iconProvider.icon(filePath);

具体实现:

void MainWindow::showFiles(const QStringList &paths)

    QFileIconProvider iconProvider;
    for(const QString &filePath : paths)
        // 获取图标
        const QString toolTip = QDir::toNativeSeparators(filePath);
        const QString relativePath = QDir::toNativeSeparators(currentDir.relativeFilePath((filePath)));
        const qint64 size = QFileInfo(filePath).size();

        QIcon icon = iconProvider.icon(filePath);

        QTableWidgetItem *fileNameItem = new QTableWidgetItem(relativePath);
        fileNameItem->setData(absoluteFileNameRole, QVariant(filePath));
        fileNameItem->setToolTip(toolTip);
        fileNameItem->setFlags(fileNameItem->flags() ^ Qt::ItemIsEditable);
        // 添加图标进入名称的位置
        fileNameItem->setIcon(icon);

        // 添加路径
        QTableWidgetItem *pathItem = new QTableWidgetItem(filePath);
        pathItem->setData(absoluteFileNameRole, QVariant(filePath));
        pathItem->setToolTip(toolTip);
        pathItem->setFlags(fileNameItem->flags() ^ Qt::ItemIsEditable);

        // 大小
        QTableWidgetItem *sizeItem = nullptr;
        // 如果是目录则sizeItem值为空
        QFileInfo fileInfo(filePath);
        if(fileInfo.isDir())
            // 如果是目录,直接设置为nullptr, 不显示大小
            sizeItem = nullptr;
        else
            // 如果是目录,计算文件大小并设置为sizeItem
            sizeItem =  new QTableWidgetItem(tr("%1 KB")
                                             .arg(int((size + 1023) / 1024)));
            sizeItem->setData(absoluteFileNameRole, QVariant(filePath));
            sizeItem->setToolTip(toolTip);
            sizeItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
            sizeItem->setFlags(sizeItem->flags() ^ Qt::ItemIsEditable);
        
        int row = ui->filesTable->rowCount();
        ui->filesTable->insertRow(row);
        ui->filesTable->setItem(row, 0, fileNameItem);
        ui->filesTable->setItem(row, 1, pathItem);
        ui->filesTable->setItem(row, 2, sizeItem);
    

    ui->fileFoundLabel->setText(tr("%n file(s) found (Double click on a file to open it)", nullptr, paths.size()));
    ui->fileFoundLabel->setWordWrap(true);

5、目录查找范围

findRecursion函数中,这部分放在else循环外 遍历搜索的子目录。在内的话就不遍历子目录的内容

        foreach (const QString& dir, currentDir.entryList(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot))
        
            findRecursion(prefix + dir, fileName, result);
        

6、 功能实现

以上是关于Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实(下)的主要内容,如果未能解决你的问题,请参考以下文章

Debian 在没有桌面的情况下启动 Qt GUI 应用程序

Python Qt GUI设计:做一款串口调试助手(实战篇—1)

Python Qt GUI设计:做一款串口调试助手(实战篇—1)

现代 Java GUI 框架,如 WPF 或 Qt?

Python Qt GUI设计:QPainterQPenQBrush和QPixmap窗口绘图类(基础篇—17)

Python Qt GUI设计:QPainterQPenQBrush和QPixmap窗口绘图类(基础篇—17)