当前位置: 首页 > news >正文

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

⭐️我叫恒心,一名喜欢书写博客的研究生在读生。

原创不易~转载麻烦注明出处,并告知作者,谢谢!!!

这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。

在这里插入图片描述

功能点一:文件查找与现实

0、知识点

  • 打开文件管理器进行目录选择
  • 记忆下拉框的内容
  • filetable使用
  • 文件信息显示
  • 文件图标的获取
  • 自定义排序

1、 确定需求

  1. 在搜索栏输入关键字,快速搜索系统桌面目录里的文件和文件夹,展示在列表中,包含程序图标、名称、路径、大小信息。

注:

​ a. 文件夹无需展示大小

​ b. 搜索结果无需包含桌面文件夹中的子文件和子文件夹;

文件夹无需显示大小:

        // 大小QTableWidgetItem *sizeItem = nullptr;// 如果是目录则sizeItem值为空QFileInfo fileInfo(filePath);if(fileInfo.isDir()){// 如果是目录,直接设置为nullptr, 不显示大小sizeItem = nullptr;}else{// 如果是目录,计算文件大小并设置为sizeItemsizeItem =  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);}

2、 查找和文件目录选择

如果是只通过编写代码的话,就直接通过connect函数进行槽的绑定就可以啦。

这里主要尝试ui下的槽函数,可视化添加槽。

具体的槽函数实现功能:

// 当查找的按钮被触碰时触发的槽函数
void MainWindow::on_findButton_clicked()
{// 注意这里用的filesTable 是wiget类型的ui->filesTable->setRowCount(0);QString fileName = ui->fileComboBox->currentText();QString text = ui->textComboBox->currentText();QString path = QDir::cleanPath(ui->directoryCombox->currentText());// 查找并显示文件currentDir = QDir(path);// 更新目录watcher.removePath(currentDir.path());watcher.addPath(path);findFilesInDirectory(path, ui->fileComboBox->currentText(), ui->textComboBox->currentText());QStringList files;// 文件名进行查找文件findRecursion(path, fileName.isEmpty() ? QStringLiteral("*") : fileName, &files);// 在已经查找出的文件进一步查找哪些包含了textif(!text.isEmpty())files = findFiles(files, text);files.sort();showFiles(files);
}

目录选择

void MainWindow::on_broweButton_clicked()
{QString directory = QDir::toNativeSeparators(QFileDialog::getExistingDirectory(this,tr("Find Files"),QDir::currentPath()));if(!directory.isEmpty()){if(ui->directoryCombox->findText(directory) == -1)ui->directoryCombox->addItem(directory);ui->directoryCombox->setCurrentIndex(ui->directoryCombox->findText(directory));}
}

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{// 如果是目录,计算文件大小并设置为sizeItemsizeItem =  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、 功能实现

image-20230219104015295

最后 🐶狗头保命

一名喜欢书写博客的研究生在读生

如果觉得有用,麻烦三连支持一下欧,希望这篇文章可以帮到你,你的点赞是我持续更新的动力。
如果有感兴趣的小伙伴,欢迎留言后面会继续将笔记补上去~

相关文章:

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

⭐️我叫恒心&#xff0c;一名喜欢书写博客的研究生在读生。 原创不易~转载麻烦注明出处&#xff0c;并告知作者&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。 功能点一&#xff1a;文件查找与…...

有关数据库的一级、二级、三级封锁协议

一级封锁协议 一级封锁协议是指&#xff0c;事务T在修改数据R之前必须先对其加X锁&#xff0c;直到事务结束才释放。事务结束包括正常结束&#xff08;COMMIT&#xff09;和非正常结束&#xff08;ROLLBACK).一级封锁协议可防止丢失修改&#xff0c;并保证事务T是可恢复的。在…...

【Android Studio】【学习笔记】【2023春】

文章目录零、常用一、界面布局疑问&报错零、常用 一、界面布局 Android——六大基本布局总结/CSDN小马 同学 【Android】线性布局&#xff08;LinearLayout&#xff09;最全解析/CSDNTeacher.Hu 一个不错的计算器界面&#x1f447; Android Studio App LinearLayout多层…...

window.open()下载文件重命名/js下载文件重命名/js跨域下载文件重命名

普通文件下载 // 1 var fileUrl https://xxxx.docx; window.open(fileUrl"?attname文档.docx");// 2 var a document.createElement(a); a.href https://xxxx.docx; a.download 文档.docx; a.target "_blank"; a.click();以上方式 attname 和 a.down…...

zookeeper:简介及常用命令

目录 一、Zookeeper简介 二、Zookeeper服务端常用命令 1、启动ZooKeeper服务 2、查看ZooKeeper服务状态 3、停止ZooKeeper服务 4、重启ZooKeeper服务 三、Zookeeper客户端常用命令 1、连接ZooKeeper服务端 2、断开连接&#xff1a;quit 3、查看命令帮助&#xff1a;help…...

与流程挖掘布道者熵评科技孙一鸣博士共话流程挖掘市场的起源与前景 | 爱分析访谈

调研&#xff1a;李进宝 陈元新 撰写&#xff1a;李进宝 陈元新 随着数字化转型持续深入&#xff0c;国内企业流程挖掘需求初露端倪。流程挖掘是指通过采集和分析企业数据&#xff0c;以可视化流程图还原企业实际发生的业务流程&#xff0c;进而评估流程运行状况、诊断流程运…...

第十一届蓝桥杯省赛——2解密

题目&#xff1a;【问题描述】小明设计了一种文章加密的方法&#xff1a;对于每个字母 c&#xff0c;将它变成某个另外的字符 Tc。下表给出了字符变换的规则&#xff1a;字母cTc字母cTc字母cTc字母cTcaynlAYNLbxogBXOGcmpoCMPOddquDDQUearfEARFfcssFCSSgitzGITZhkupHKUPinvwINV…...

ChatGPT解答:PYQT5 美化各种控件的方案和实例

ChatGPT解答&#xff1a;PYQT5 美化各种控件的方案和实例 修改按钮样式 button QPushButton(按钮, self) button.setStyleSheet(QPushButton{background-color: red; border-radius: 5px;})修改标签样式 label QLabel(标签, self) label.setStyleSheet(QLabel{color: blue; …...

js实现翻盘抽奖

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>礼物编辑</title><style>* {margin: 0;padding: 0;box-sizing: border-box;list-style-type: none;text-decoration: none;}.container {d…...

Qt QtCreator 安卓开发环境搭建

踩坑 我的qt是使用在线安装工具安装的&#xff0c;Qt版本使用的是5.15.2&#xff0c;QtCreator版本9.0.2 在网上很多教程都是如下步骤 1.安装qt 2.安装jdk 3.安装android-sdk 4.安装android-ndk 5.配置android设置 例如&#xff1a; https://blog.csdn.net/weixin_51363326/…...

Flutter知识点(二)处理Json

flutter不支持反射&#xff0c;所以本来很简单的事情&#xff0c;一下子变复杂了。当然官方也提供了一些工具来方便开发者。 由于Dart的map和array的数据结构和json一样&#xff0c;所以在flutter中&#xff0c;变成了json string与Map&#xff0c;array之间的砖换。 &#x…...

基本概念简介(码率,FPS(帧数),分辨率,RTMP协议)等的介绍

基本概念 为了了解视频的码率、帧率、分辨率。我们先来看看视频编码的基本原理:视频图像数据有极强的相关性,也就是说有大量的冗余信息。压缩技术就是将数据中的冗余信息去掉(去除数据之间的相关性),压缩技术包含帧内图像数据压缩技术、帧间图像数据压缩技术和熵编码压缩技…...

黑盒测试重点复习内容

黑盒测试一、等价类划分边界值分析法二、判定表法一、等价类划分边界值分析法 对于各种输入或者输出&#xff0c;必须考虑等价类和边界值&#xff0c;并补充一些特殊值&#xff0c;如空值、空格、0、异常格式等特殊值。 基本概念&#xff1a; 有效等价类&#xff1a;满足需求…...

Python每日一练(20230303)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺…...

基于Cortex-M7内核STM32F767NIH6,STM32F767VGT6,STM32F767VIT6嵌入式技术资料

STM32F7 32 位 MCUFPU 基于高性能的 ARMCortex-M7 32 位 RISC 内核&#xff0c;工作频率高达 216MHz。Cortex-M7 内核具有单浮点单元(SFPU)精度&#xff0c;支持所有 ARM 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元&#xff08;MPU&#xff09;&#…...

Nginx SSL证书A+之路

问题 myssl是常见的SSL/TLS在线免费检测网站。期望能够达到A级别。 步骤 nignx worker_processes auto;http {ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;server {listen 443 ssl;server_name xxxx.xxxx.com;keepalive_timeout 70;ssl_certific…...

周期性温度和压力波的PID自动控制解决方法

摘要&#xff1a;目前各种PID控制器仪表常用于简单的设定点&#xff08;Set Point&#xff09;和斜坡&#xff08;Ramp&#xff09;程序控制&#xff0c;但对于复杂的正弦波等周期性变量的控制则无能为力。为了采用标准PID控制器便捷和低成本的实现对正弦波等周期性变量的自动控…...

从头开始搭建一个SpringBoot项目--SpringBoot文件的上传与下载

从头开始搭建一个SpringBoot项目--SpringBoot文件的上传前言流程分析代码结构代码详情UploadFileInfo.classUploadController.classUploadDao.classUploadDao.xmlUploadServices.classUploadServicesImpl.class测试下载示例前言 文件的上传和下载是很多系统必备的功能&#xf…...

It做形式主语和宾语

主谓宾&#xff0c;主宾能被名词性的sth&#xff0c;替换&#xff0c;如动名词&#xff0c;不定式&#xff0c;从句等等 而且&#xff0c;不能出现前面或者中间&#xff0c;很长&#xff0c;一大推的在开头或者中间&#xff0c;就产生了it做形式主宾。 一、It用作形式主语当不…...

做测试一定要知道的——软件测试流程和测试规范标准文档

目录 1、目的 2、工作范围 3、工作职责 4、测试的流程 5、测试准备阶段 6、测试方法制定阶段 7、测试执行阶段 8、bug管理 9、标准文档 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 1、目的 通…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...