当前位置: 首页 > 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、目的 通…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...