Qt实践项目:仿Everything软件实现一个QtEverything
⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。
如果觉得本文能帮到您,麻烦点个赞
👍呗!
近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
Qt实践项目:仿Everything软件实现一个QtEverything
学习笔记
- Qt实践项目:仿Everything软件实现一个QtEverything
- 一、前言:
- 二、功能点:
- 功能点一:文件查找与现实
- 0、知识点
- 1、 确定需求
- 2、 查找和文件目录选择
- 3、自定义排序
- 4、文件图标获取
- 4、 功能实现
- 功能点二: 为搜索结果增加右键菜单
- 0、 知识点
- 1、 菜单栏功能实现
- 2、删除文件名实现函数
- 3、打开文件实现函数
- 4、功能实现
- 功能点三:快捷键与托盘
- 0、知识点
- 功能点四:实现模糊查询。
- 0、知识点:
- 1、 确定需求
- 功能五 :中文搜索
- 0、 知识点:
- 1、第三方库地问题
- 功能点六: 目录更新问题
- 0、知识点
- 1、**实现步骤**
- 2、功能实现
- 功能点七:其他
- 三、总结
- 四、讨论
一、前言:
最近刚好重新学习了一下Qt的知识,觉得知识点之间还是比较散乱,网上大部份书籍的例子也比较零碎,想找个一个实战的项目将一些知识点穿起来,同时项目本身又比较有趣,可以进行不断地优化,发现文件查找器系统是个很有趣的实践项目。
作为Qt的入门项目,我个人觉得这个项目真的是太棒了,涵盖了许多知识点,同时还可以对此不断地进行优化。
本文将对Qt文件查找系统进行技术总结。该系统包含了许多技术细节,包括文件管理器的打开、记忆下拉框内容、filetable
的使用、文件信息显示、文件图标获取、自定义排序、QFileSystemWatch
监视文件目录、变化后重新加载目录、库的制作、qmake使用、makefile生成外部库后引入到项目中、Qt调用第三方库的方法、表格激活状态下选中右键、右键菜单、删除功能实现、启动文件、复制文件名以及检测剪切板、快捷键使用、快捷键冲突、窗口焦点捕获、托盘、系统消息设置、正则化表达式的书写、正则化表达式的应用、模糊匹配中按照顺序进行匹配、模糊匹配中遇到空格的处理、模糊匹配算法的优化、以及如何提高模糊查询的效率(QtConcurrent)。
如果你觉得这篇文章帮到了你,欢迎
点赞+收藏+评论
, 对系统感兴趣的,欢迎订阅这个专栏欧,后面代码
会放到专栏中,并在这个专栏里进行更新讲解
欧!感谢支持⭐️❤️
二、功能点:
- 🔔基本文件查找功能
- 📁 操作搜索结果
- ⌨️ 快捷键与托盘系统
- 🔍 实现模糊查询
- 🙊 拼音转换搜索中文
- 🔍目录更新监控
- 🔍文件查找优化—缓存查询
- 🔍文件查找优化—多线程查找
- 其他(正在开发)
将作业要求分为了七个功能点,每个功能点下会列出需要地知识点,
功能点的实现是这些知识点的最佳实践
这个项目个人觉得非常有意思,所以花了一些时间去设计,也遇到了挺多Bug的,最近在忙着毕业设计,在论文写完后,后面会尝试对这个项目进行优化地,如果有兴趣地小伙伴可以关注一下专栏后期会一直在上面进行更新地,一周至少更新一篇。
功能点一:文件查找与现实
0、知识点
- 打开文件管理器进行目录选择
- 记忆下拉框的内容
filetable
使用- 文件信息显示
- 文件图标的获取
- 自定义排序
1、 确定需求
要想实现文件查找功能大致分为以下几步:
要使用Qt实现一个类似Everything文件搜索工具,可以按照以下步骤进行:
- 创建一个
Qt GUI
应用程序,并添加一个窗口作为搜索工具的主界面。 - 在主界面中添加一个文本框用于输入搜索关键字,以及一个搜索按钮用于触发搜索操作。
- 在搜索按钮的点击事件中,获取用户输入的搜索关键字,然后遍历文件系统中的所有文件和目录,并筛选出符合搜索关键字的文件和目录。
- 使用
Qt
的QFileSystemModel
类来遍历文件系统中的文件和目录。QFileSystemModel
类是一个模型-视图类,可以用来访问本地文件系统中的文件和目录。 - 在遍历文件系统的过程中,可以使用
QRegExp
类来匹配搜索关键字。QRegExp
类是Qt中的正则表达式类,可以用来进行高级字符串匹配操作。 - 使用Qt的
QTableView
类来显示搜索结果。QTableView
类是一个表格视图类,可以用来显示数据。可以将搜索结果显示为表格,并在表格中显示文件名、文件路径、文件大小和文件修改日期等信息。
关于显示地结果:
- 在搜索栏输入关键字,快速搜索系统桌面目录里的文件和文件夹,展示在列表中,包含程序图标、名称、路径、大小信息。
注:
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、通过文本排序QTextListFormat
的style
和index
进行排序。
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);
}
4、 功能实现
功能点二: 为搜索结果增加右键菜单
- 功能点二: 为搜索结果增加右键菜单,右键中菜单中包含启动和删除功能;
0、 知识点
- 表格激活状态下选中右键
- 右键菜单
- 删除功能实现
- 启动文件
- 复制文件名以及检测剪切板
1、 菜单栏功能实现
在createFilesTable
函数中实现
// 菜单ui->filesTable->setContextMenuPolicy(Qt::CustomContextMenu);connect(ui->filesTable, &QTableWidget::customContextMenuRequested,this, &MainWindow::contextMenu);connect(ui->filesTable, &QTableWidget::cellActivated,this, &MainWindow::openFileOfItem);
void MainWindow::contextMenu(const QPoint &pos)
{const QTableWidgetItem *item = ui->filesTable->itemAt(pos);if(!item)return;QMenu menu;
#ifndef QT_NO_CLIPBOARDQAction *copyAction = menu.addAction("Copy Name");
#endifQAction *openAction = menu.addAction("Open");deleteAction = menu.addAction("delete");QAction *action = menu.exec(ui->filesTable->mapToGlobal(pos));if(!action)return;const QString fileName = fileNameOfItem(item);if(action == openAction)openFile(fileName);else if (action == deleteAction){qDebug()<<"deleteAction"<<endl;deleteFileFromContextMenu();
// connect(deleteAction, &QAction::triggered, this, &MainWindow::deleteFileFromContextMenu);}
#ifndef QT_NO_CLIPBOARDelse if (action == copyAction)QGuiApplication::clipboard()->setText(QDir::toNativeSeparators(fileName));
#endif
}
具体的实现思路:
- 需要定义一个
QAction
- 根据QAction 唤醒对应的功能
2、删除文件名实现函数
void MainWindow::deleteFileFromContextMenu()
{QList<QTableWidgetItem *> selectedItems = ui->filesTable->selectedItems();QMessageBox::StandardButton reply = QMessageBox::question(this, tr("Delete"), tr("Are you sure to delete the selected files?"), QMessageBox::Yes | QMessageBox::No);if (reply == QMessageBox::Yes) {for (QTableWidgetItem *item : selectedItems) {QString filePath = item->data(absoluteFileNameRole).toString();QFile file(filePath);file.remove();ui->filesTable->removeRow(item->row());}}
}
3、打开文件实现函数
oid MainWindow::openFile(const QString &fileName)
{QDesktopServices::openUrl(QUrl::fromLocalFile(fileName));
}
4、功能实现
功能点三:快捷键与托盘
- 功能点三:程序启动后默认隐藏,通过alt+空格 唤出,再次按下 alt+空格 隐藏;
0、知识点
- 快捷键使用
- 快捷键冲突
- 窗口焦点捕获
- 托盘
- 系统消息设置
详细内容将更新在专栏中,有兴趣的小伙伴可以关注这个专栏
😄😄😄
功能点四:实现模糊查询。
0、知识点:
- 正则化表达式的书写
- 正则化表达式的应用
- 模糊匹配中按照顺序进行匹配
- 模糊匹配中遇到空格的处理
- 模糊匹配算法的优化
- 如何提高模糊查询的效率(QtConcurrent)
1、 确定需求
要实现模糊查询,您可以使用正则化表达式来匹配文件名。正则表达式可以匹配类似于通配符的模式,并可以通过捕获组提取有用的信息。
这个功能真是饶了太久了,一开始没弄清楚需求。
先说一下需求是这样的:
支持模糊匹配搜索,例如输入“wps”,能够搜到 “wps.exe”也能搜到 “windows powsershell.exe";
需要定位到需要修改的函数。
详细内容将更新在专栏中,有兴趣的小伙伴可以关注这个专栏
😄😄😄
功能五 :中文搜索
- 中文名称的程序支持通过拼音首字母进行搜索,例如输入"wx", 能够搜到 "微信”程序;
支持模糊匹配搜索,例如输入“wps”,能够搜到 “wps.exe”也能搜到 “windows powsershell.exe"; 中文搜索问题。
可以按照以下步骤进行实现:
0、 知识点:
- 库的制作
- qmake使用
- makefile生成外部库后引入到项目中
- Qt调用第三方库的方法
1、第三方库地问题
pinyin4cpp 有点坑啊。。。 很多词都对不上的!!!
比如微信
生成的居然是wei wei
早知道这么垃圾就不用了。。。
留下一个坑待修复:
详细内容将更新在专栏中,有兴趣的小伙伴可以关注这个专栏
😄😄😄
// some bug in hereHanyuPinyinOutputFormat *outputFormat;PinyinHelper::toHanyuPinyinStringArray(firstChar, outputFormat, &pinyinList); // 获取文件名对应的汉语拼音QString firstLetters; // 存储汉语拼音的首字母foreach(const QString& pinyin, pinyinList) {qDebug()<<"pinyin "<<pinyin<<endl;if (!pinyin.isEmpty() && pinyin.at(0).isLower()) {firstLetters += pinyin.at(0);qDebug()<<"firstLetters "<<firstLetters<<endl;if (fileName.contains(firstLetters, Qt::CaseInsensitive)){result->append(filePath);}break;}}
只匹配到第一个字母就返回中文的。
功能点六: 目录更新问题
0、知识点
QFileSystemWatch
监视文件目录- 变化后重新加载目录
1、实现步骤
2、功能实现
详细内容将更新在专栏中,有兴趣的小伙伴可以关注这个专栏
😄😄😄s
接下来测试一下:
当我们选定了需要监控的目录,在改目录下更新的所有操作都会被
功能点七:其他
项目Ui优化
知识点:
- qss的使用
- 多线程机制
- 运用设计模式对代码进行封装
简单地为每个目录创建多个线程,容易因为迭代深度太高二导致性能问题。 糟糕的设计方法
QList<QFuture<void>> futures;foreach (const QString& dir, currentDir.entryList(QDir::Dirs | QDir::NoSymLinks | QDir::NoDotAndDotDot)){SearchParam param;param.path = prefix + dir;param.fileName = fileName;futures.append(QtConcurrent::run(this, &MainWindow::searchDirectory, param, result));}QFutureSynchronizer<void> sync;sync.waitForFinished();
解决思路:用线程池进行管理。
详细内容将更新在专栏中,有兴趣的小伙伴可以关注这个专栏
😄😄😄
三、总结
本文将对Qt文件查找系统进行技术总结。该系统包含了许多技术细节,包括文件管理器的打开、记忆下拉框内容、
filetable
的使用、文件信息显示、文件图标获取、自定义排序、QFileSystemWatch
监视文件目录、变化后重新加载目录、库的制作、qmake使用、makefile生成外部库后引入到项目中、Qt调用第三方库的方法、表格激活状态下选中右键、右键菜单、删除功能实现、启动文件、复制文件名以及检测剪切板、快捷键使用、快捷键冲突、窗口焦点捕获、托盘、系统消息设置、正则化表达式的书写、正则化表达式的应用、模糊匹配中按照顺序进行匹配、模糊匹配中遇到空格的处理、模糊匹配算法的优化、以及如何提高模糊查询的效率(QtConcurrent)。
- 其中,打开文件管理器进行目录选择是该系统的一个基础功能。通过使用记忆下拉框,系统可以记忆用户的历史输入,并且提供方便快捷的选项。
filetable
作为文件管理的核心组件,可以用于显示文件信息以及进行自定义排序。通过获取文件图标,系统可以使用户对文件进行更加直观的辨认。QFileSystemWatch
可以帮助系统监视文件目录的变化,从而能够及时地更新文件列表。库的制作和使用是一个重要的话题,qmake和makefile是实现库制作和使用的关键工具。Qt调用第三方库的方法,可以帮助系统实现更加丰富的功能。 - 在文件查找系统中,右键菜单和删除功能的实现都是非常重要的。启动文件、复制文件名以及检测剪切板都是与用户体验密切相关的功能,快捷键的使用和冲突也需要特别关注。窗口焦点捕获和托盘是增强系统交互性的重要特性。系统消息设置和正则化表达式的应用可以提供更加个性化的设置。模糊匹配是文件查找系统中常见的查询方式,按照顺序进行匹配和遇到空格的处理都需要特别注意。同时,对于模糊匹配算法的优化以及如何提高模糊查询的效率也需要仔细思考。
四、讨论
这个项目仅仅是作为新手学习的时候的学习笔记,在实现的地方可能会存在一些不合理的地方,烦请大佬批评与指正,⭐️:⭐️ ⭐️
在实现文件系统时,总有些疑惑就是:Everything这种本地文件搜索器是如何这么快检索到需要的文件呢?
非常期待各位大佬留言解惑!
最后,最后
如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力
相关文章:

Qt实践项目:仿Everything软件实现一个QtEverything
⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…...

WEB网站服务(一)
1.1 Apache网站服务基础1.1.1Apache简介Apache HTTP Server是开源软件项目的杰出代表,基于标准的HTTP网络协议提供网页浏览服务。Apache服务器可以运行在Linux,UNIX,windows等多种操作系统平台中。1.Apache的起源1995年,Apache服务程序的1.0版…...

Python数据分析script必备知识(一)
Python数据分析script必备知识(一) 1.重定向终端输出内容 使生成的结果移动到其他位置 # 重定向, 使生成的结果移动到其他位置 import syssys.stderr = sys.stdoutprint(dir(sys)) # ,,,,,__stderr__, __stdin__, __stdout__,,,,,,# 使用场景:脚本上线时,想要把输出结果…...

初识linux之管道
一、进程间通信的概念大家都知道,进程是具有独立性的,因为一个程序运行起来生成进程时,也会生成它的进程结构体,即PCB,然后然后通过进程结构体中的结构体指针找到它的虚拟地址空间,然后再通过它的页表映射到…...

C++成神之路 | 第一课【步入C++的世界】
目录 一、认识C++ 1.1、关于 C++ 1.2、C++的前世今生 1.2.1、C+...

【面试题】大厂面试官:你做过什么有亮点的项目吗?
大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库前言大厂面试中除了问常见的算法网络基础,和一些八股文手写体之外,经常出现的一个问题就是,你做过什么项目…...

Springboot Long类型数据太长返回给前端,精度丢失问题 复现、解决
前言 惯例,收到兄弟求救,关于long类型丢失精度的问题: 存在一个初学者不会,就会有第二个初学者不会,所以我出手。 正文 不多说,开搞。 如题, 后端返回的数据 给到 前端, Long类型数…...

Anaconda虚拟环境的创建方法(命令创建)
虚拟环境介绍: 虚拟环境是一为某个项目创建的专属于它的python包,因此做python项目时,一般一个项目用一个虚拟环境。在实际开发中,如果项目A需要某个包的1.0版本,项目B需要此包的2.0版本。如果没有安装虚拟环境&#…...

数据结构——树与二叉树
作者:几冬雪来 时间:2023年3月22日 内容:数据结构树与二叉树的讲解(介绍) 目录 前言: 1.树的概念: 2.树与非树: 3.树的定义: 4.树的应用: 二叉树&…...

vue后台管理系统
后面可参考下:vue系列(三)——手把手教你搭建一个vue3管理后台基础模板 以下代码项目gitee地址 文章目录1. 初始化前端项目初始化项目添加加载效果配置 vite.config.js2. 使用路由安装路由配置路由配置别名和跳转安装pathvite.config.jsjsco…...

spring boot 集成 postgis jar
要将 PostGIS 集成到 Spring Boot 应用程序中,需要按照以下步骤进行操作:1. 将 PostGIS JDBC 驱动程序添加到项目依赖项中。可以在 Maven 或 Gradle 中添加以下依赖项:Maven:```xml <dependency><groupId>org.postgresql</groupId><artifactId>pos…...

【Java进阶篇】——反射机制
一、反射的概念 1.1 反射出现的背景 Java程序中,所有对象都有两种类型:编译时类型和运行时类型,而很多时候对象的编译时类型和运行时类型不一致 Object obj new String("hello")、obj.getClass(); 如果某些变量或形参的声明类型…...

Oracle中含有recover 状态的数据文件环境中,做异机恢复
背景: 我们在一些恢复测试案例中,会经常遇到一些奇怪的问题,其中有的是源端数据文件不规范而导致恢复过程出错,比较常见的错误有: 数据文件名称重复(如:/oradata1/user01.dbf 和 /oradata2/us…...

图像识别模型
一、数据准备 首先要做一些数据准备方面的工作:一是把数据集切分为训练集和验证集, 二是转换为tfrecord 格式。在data_prepare/文件夹中提供了会用到的数据集和代码。首先要将自己的数据集切分为训练集和验证集,训练集用于训练模型…...

[零刻]EQ12 N100 迷你主机:从开箱到安装ESXi+虚拟机
开箱先上图:配置详情:EQ12采用了Intel最新推出的N100系列的处理,超低的功耗,以及出色的CPU性能用来做软路由或者是All in one 相当不错,CPU带有主动散热风扇,在长期运行下散热完全不用担心,性价…...

MongoDB基础
优质博客 IT-BLOG-CN 一、简介 MongoDB是一个强大的分布式文件存储的NoSQL数据库,天然支持高可用、分布式和灵活设计。由C编写,运行稳定,性能高。为WEB应用提供可扩展的高性能数据存储解决方案。主要解决关系型数据库数据量大,并…...

【Linux】Linux基本指令(下)
前言: 紧接上期【Linux】基本指令(上)的学习,今天我们继续学习基本指令操作,深入探讨指令的基本知识。 目录 (一)常用指令 👉more指令 👉less指令(重要&…...

基于uniapp+u-view开发小程序【技术点整理】
一、上传图片 1.实现效果: 2.具体代码: <template><view><view class"imgbox"><view>职业证书</view><!-- 上传图片 --><u-upload :fileList"fileList1" afterRead"afterRead"…...

投稿指南【NO.7】目标检测论文写作模板(初稿)
中文标题(名词性短语,少于20字,尽量不使用外文缩写词)张晓敏1,作者1,2***,作者2**,作者2*(通信作者右上标*)1中国科学院上海光学精密机械研究所空间激光传输与探测技术重…...

【绘图】比Matplotlib更强大:ProPlot
✅作者简介:在读博士,伪程序媛,人工智能领域学习者,深耕机器学习,交叉学科实践者,周更前沿文章解读,提供科研小工具,分享科研经验,欢迎交流!📌个人…...

经典七大比较排序算法 ·上
经典七大比较排序算法 上1 选择排序1.1 算法思想1.2 代码实现1.3 选择排序特性2 冒泡排序2.1 算法思想2.2 代码实现2.3 冒泡排序特性3 堆排序3.1 堆排序特性:4 快速排序4.1 算法思想4.2 代码实现4.3 快速排序特性5 归并排序5.1 算法思想5.2 代码实现5.3 归并排序特性…...

【网络安全工程师】从零基础到进阶,看这一篇就够了
学前感言 1.这是一条需要坚持的道路,如果你只有三分钟的热情那么可以放弃往下看了。 2.多练多想,不要离开了教程什么都不会,最好看完教程自己独立完成技术方面的开发。 3.有问题多google,baidu…我们往往都遇不到好心的大神,谁…...

素描-基础
# 如何练习排线第一次摸板子需要来回的排线,两点然后画一条线贯穿两点画直的去练 练线的定位叫做穿针引线法或者两点一线法 练完竖线练横线 按照这样去练顺畅 直线曲线的画法 直线可以按住shift键 练习勾线稿 把线稿打开降低透明度去勾线尽量一笔的去练不要压…...

Elasticsearch:高级数据类型介绍
在我之前的文章 “Elasticsearch:一些有趣的数据类型”,我已经介绍了一下很有趣的数据类型。在今天的文章中,我再进一步介绍一下高级的数据类型,虽然这里的数据类型可能和之前的一些数据类型有所重复。即便如此,我希望…...

Golang每日一练(leetDay0012)
目录 34. 查找元素首末位置 Find-first-and-last-position-of-element-in-sorted-array 🌟🌟 35. 搜索插入位置 Search Insert Position 🌟 36. 有效的数独 Valid Sudoku 🌟🌟 🌟 每日一练刷题专栏 …...

Web前端:6种基本的前端编程语言
如果你想在前端web开发方面开始职业生涯,学习JavaScript是必须的。它是最受欢迎的编程语言,它功能广泛,功能强大。但JavaScript并不是你唯一需要知道的语言。HTML和CSS对于前端开发至关重要。他们将帮助你开发用户友好的网站和应用程序。什么…...

九【springboot】
Springboot一 Spring Boot是什么二 SpringBoot的特点1.独立运行的spring项目三 配置开发环境四 配置开发环境五 创建 Spring Boot 项目1.在 IntelliJ IDEA 欢迎页面左侧选择 Project ,然后在右侧选择 New Project,如下图2.在新建工程界面左侧,…...

《程序员成长历程的四个阶段》
阶段一:不知道自己不知道(Unconscious incompetence) 大学期间,我和老师做过一些小项目,自认为自己很牛,当时还去过一些公司面试做兼职,但是就是不知道为什么没有回复。那个时期的我,压根不知道自己不知道&…...

【SpringBoot】Spring data JPA的多数据源实现
一、主流的多数据源支持方式 将数据源对象作为参数,传递到调用方法内部,这种方式增加额外的编码。将Repository操作接口分包存放,Spring扫描不同的包,自动注入不同的数据源。这种方式实现简单,也是一种“约定大于配置…...

uni-app基础知识介绍
uni-app的基础知识介绍 1、在第一次将代码运行在微信开发者工具的时候,应该进行如下的配置: (1)将微信开发者工具路径进行配置; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lbyk5Jw2-16790251840…...