045_第三代软件开发-U盘监测

2023-11-06 00:45

本文主要是介绍045_第三代软件开发-U盘监测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

头图

第三代软件开发-U盘监测

文章目录

  • 第三代软件开发-U盘监测
    • 项目介绍
    • U盘监测
      • 原理解释
      • 源代码

关键字: QtQmlUSBDisk文件

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

U盘监测

一个项目在前期研究阶段需要的是什么,是理论的支撑,在验证这一理论的时候,需要大量的数据做支撑,所以我们需要软件具备数据记录功能,虽然这些功能不会最终暴露给用户,但是在前期研究阶段是必不可少的,所以我们需要具备这个功能,而这个功能开启的必要条件就是第一要在工程模式,第二要在U盘插入的情况下,才会开启。

而最终交付的用户的需求是需要把用户的报告导出到U盘,因为目前咱的设备是不带打印机的,无法直接打印出报告,而Linux下适配打印机,难度会超过Windows,不是我们不会,而是每家用的打印机都不一样,加上技术支持的技术不在线,所以暂时只是支持用户将报告导出到U盘,后期不排除直接配置打印机或者介入医院标准的HIS系统,不过那都是后话了,今天咱们主要解决USB下U盘监测的问题。

闭坑指南

Linux,每种系统实现的方式类似,又不完全一致,所以一下内用仅适用于Ubuntu 22.04版本,其他系统不做保证,不过原理应该是一致的,稍作改动即可。

原理解释

其实不管什么设备,在连入Linux系统,都会对应出一个文件来,为啥内,Linux 设计哲学之一 一切皆文件,所以我们实现的原理就是检测某一个文件夹的变化,这个Qt就给我们提供了很好的类QFileSystemWatcher,可以直接使用就可以。每个系统U盘设备的挂在有一定差异,自行搞一下就OK了。

源代码

头文件


#include <QObject>#include "T_Core/Turing_FileMonitoring/turing_filesystemwatcher.h"class XXXX : public QObject
{Q_OBJECTQ_PROPERTY(bool usbIn READ usbIn WRITE setUsbIn NOTIFY usbInChanged)                                    // USB插入标志Q_PROPERTY(QString usbPath READ usbPath WRITE setUsbPath NOTIFY usbPathChanged)                         // USB路劲Q_PROPERTY(QString systemPath READ systemPath WRITE setSystemPath NOTIFY SystemPathChanged)             // USB监听文件夹public:explicit XXXX(QObject *parent = nullptr);~XXXX();static XXXX* getInstance();QString getUserName();bool usbIn() const;void setUsbIn(bool newUsbIn);QString usbPath() const;void setUsbPath(const QString &newUsbPath);const QString &systemPath() const;void setSystemPath(const QString &newSystemPath);signals:void usbInChanged();void usbPathChanged();void SystemPathChanged();void signalUmountUSB();public slots:void slotUmountDisk();
private slots:void slot_GetSystemDevByName();void slot_AddSystemDevByName(QString strFolder, QString strFile);void slot_DeleteSystemDevByName(QString strFolder, QString strFile);private:Turing_FileSystemWatcher*                           m_systemWatcher             = nullptr;QString                                             m_systemPath                = "";QStringList                                         m_systemList;bool                                                m_usbIn                     = false;QString                                             m_usbPath                   = ".";};#endif // XXXX_H

源文件

#include "XXXX.h"#include <QProcess>#include <iostream>#include <QTextStream>
#include <QEventLoop>
#include <QTimer>#include <QDir>
#include <QEventLoop>
#include <QTimer>static QTextStream cout(stdout, QIODevice::WriteOnly);Q_GLOBAL_STATIC(XXXX,XXXX)                                      // 单例宏
/*** @brief XXXX::XXXX* @param parent* 构造函数*/
XXXX::XXXX(QObject *parent): QObject{parent}
{m_systemWatcher = new Turing_FileSystemWatcher();connect(m_systemWatcher,&Turing_FileSystemWatcher::signalAddFile,this,&XXXX::slot_AddSystemDevByName);connect(m_systemWatcher,&Turing_FileSystemWatcher::signalDeleteFile,this,&XXXX::slot_DeleteSystemDevByName);connect(this, &XXXX::SystemPathChanged,this,&XXXX::slot_GetSystemDevByName);setSystemPath("/media/" + getUserName());}XXXX::~XXXX()
{}
/*** @brief XXXX::getInstance* @return* 单例接口*/
XXXX *XXXX::getInstance()
{return XXXX;
}
/*** @brief XXXX::getUserName* @return* 获取用户名*/
QString XXXX::getUserName()
{
#ifdef Q_OS_LINUXQStringList envVariables;envVariables << "SUDO_USER.*";QStringList environment = QProcess::systemEnvironment();foreach (QString string, envVariables) {int index = environment.indexOf(QRegExp(string));if (index != -1){QStringList stringList = environment.at(index).split('=');if (stringList.size() == 2){qInfo() << "系统名称获取成功,系统名称: " << stringList.at(1);return stringList.at(1);}}}qWarning() << "系统名称获取失败,默认系统名称: " << "turing";return "turing";
#endif
}/*** @brief XXXX::slot_GetSystemDevByName 初始化检测U盘是否存在*/
void XXXX::slot_GetSystemDevByName()
{QDir dir(m_systemPath);if(!dir.exists())return;dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);dir.setSorting(QDir::Name);m_systemList = dir.entryList();if(m_systemList.size() > 0){setUsbIn(true);// 默认活动U盘为获取的第一个setUsbPath(m_systemPath + "/" + m_systemList.at(0));qInfo() << "初始化获取U盘,U盘路径: " << m_usbPath;}else{setUsbIn(false);}
}/*** @brief XXXX::slot_AddSystemDevByName 插入活动U盘* @param strFolder* @param strFile*/
void XXXX::slot_AddSystemDevByName(QString strFolder, QString strFile)
{if(strFolder != m_systemPath)return;// 判断是否存在活动U盘if(!m_usbIn){QEventLoop loop;//定义一个新的事件循环QTimer::singleShot(100, &loop, SLOT(quit()));  //创建单次定时器,槽函数为事件循环的退出函数loop.exec();  //事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出setUsbPath(m_systemPath + "/" + strFile);setUsbIn(!m_usbIn);qInfo() << "挂在U盘,路径: " << m_usbPath;}
}/*** @brief XXXX::slot_DeleteSystemDevByName 拔出活动U盘* @param strFolder* @param strFile*/
void XXXX::slot_DeleteSystemDevByName(QString strFolder, QString strFile)
{if(strFolder != m_systemPath)return;if(m_usbIn){// 判断拔出的是否是活动U盘if(m_usbPath != m_systemPath + "/" + strFile){return;}setUsbPath("./");setUsbIn(!m_usbIn);qInfo() << "U盘非正常状态卸载,请检查数据完整性!";}else{qInfo() << "U盘正常弹出. 完毕";}
}/*** @brief XXXX::slotUmountDisk  卸载U盘槽函数*/
void XXXX::slotUmountDisk()
{emit signalUmountUSB();QEventLoop loop;//定义一个新的事件循环QTimer::singleShot(1000, &loop, SLOT(quit()));  //创建单次定时器,槽函数为事件循环的退出函数loop.exec();  //事件循环开始执行,程序会卡在这里,直到定时时间到,本循环被退出int ret = system(QString("echo umount '%1'").arg(m_usbPath).toLocal8Bit());if(ret == -1){qInfo() << "卸载U盘失败";}else{setUsbIn(false);qInfo() << "弹出U盘";}
}/*** @brief XXXX::usbIn* @return* 返回USB插入拔出状态*/
bool XXXX::usbIn() const
{return m_usbIn;
}
/*** @brief XXXX::setUsbIn* @param newUsbIn* 设置USB插入拔出状态*/
void XXXX::setUsbIn(bool newUsbIn)
{if (m_usbIn == newUsbIn)return;m_usbIn = newUsbIn;emit usbInChanged();
}
/*** @brief XXXX::usbPath* @return* 返回USB设备路径*/
QString XXXX::usbPath() const
{return m_usbPath;
}
/*** @brief XXXX::setUsbPath* @param newUsbPath* 设置USB设备路径*/
void XXXX::setUsbPath(const QString &newUsbPath)
{if (m_usbPath == newUsbPath)return;m_usbPath = newUsbPath;emit usbPathChanged();
}/*** @brief XXXX::systemPath 返回检测U盘存在路径* @return*/
const QString &XXXX::systemPath() const
{return m_systemPath;
}/*** @brief XXXX::setSystemPath 设置检测U盘存在路径* @param newSystemPath*/
void XXXX::setSystemPath(const QString &newSystemPath)
{if (m_systemPath == newSystemPath)return;m_systemPath = newSystemPath;qInfo() << "新增监控路径:" << m_systemPath;m_systemWatcher ->addWatchPath(m_systemPath);emit SystemPathChanged();
}
  1. 这里需要注意,我使用了Qt的属性系统,我这里有三个属性,这些属性将在QML中被使用。

    Q_PROPERTY(bool usbIn READ usbIn WRITE setUsbIn NOTIFY usbInChanged)                                    // USB插入标志
    Q_PROPERTY(QString usbPath READ usbPath WRITE setUsbPath NOTIFY usbPathChanged)                         // USB路劲
    Q_PROPERTY(QString systemPath READ systemPath WRITE setSystemPath NOTIFY SystemPathChanged)             // USB监听文件夹
    
  2. 第二部就是需要给这个U盘检测模块设置一个监测地址

    void XXXX::setSystemPath(const QString &newSystemPath)
    {if (m_systemPath == newSystemPath)return;m_systemPath = newSystemPath;qInfo() << "新增监控路径:" << m_systemPath;m_systemWatcher ->addWatchPath(m_systemPath);emit SystemPathChanged();
    }
    

    这里搭建看了可一个Turing_FileSystemWatcher,暂时这里可以直接把它理解成为一个Qt的文件监视器,只不过Qt的文件监视器只能知道文件夹变化了,而不能准确返回是增加了、减少了还是修改了,我们自己的Turing_FileSystemWatcher可以分类识别到时增加、减少还是修改,仅此而已,不影响代码阅读。

  3. 接着就是Qt 的事件循环,等待Turing_FileSystemWatcher的信号了。这里就不做具体解释了,代码没有太大难度。看下注释应该没有问题。


博客签名2021

这篇关于045_第三代软件开发-U盘监测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353492

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

Linux的系统性能监测参数获取方法介绍

目前的工程需要简单的监测一下Linux系统的:CPU负载、内存消耗情况、几个指定目录的磁盘空间、磁盘I/O、swap的情况还有就是网络流量。   Linux下的性能检测工具其实都有很多。   mrtg(http://people.ee.ethz.ch/~oetiker/webtools/mrtg/)就是一个很不错的选择。不过用mrtg就要装sysstat、apache、snmp、pe

【软件工程】软件开发模型

三、瀑布模型  四、几种软件开发模型的主要特点 题目 判断题 选择题 小结

集成电路学习:什么是SDK软件开发工具包

SDK:软件开发工具包         SDK,即Software Development Kit(软件开发工具包),是一套由软件提供商或其他组织提供的开发工具集合。这些工具旨在帮助开发者更快速、更便捷地创建、测试和部署软件应用程序。以下是对SDK的详细解释: 一、SDK的定义与组成         定义:SDK是一套包含编程工具、代码示例、技术说明文档、调试和测试工具等内容的软件包,有

从知识视角理解软件开发

软件构造中的核心知识:业务知识与架构知识 在软件构造过程中,最关键的两类知识是业务知识和架构知识。业务知识回答“什么是正确的软件”,而架构知识解决“如何正确地构造软件”。从这两个方面深入理解软件构造,可以帮助我们在设计和开发过程中做出更明智的决策。 1. 业务知识:定义正确的软件 业务知识是关于如何解决现实问题的知识,包括业务的目标、规则、限制、和已有的解决方案。它定义了“正确的软件”是什么

河道水位流量监测系统解决方案

一、概述 中国是世界上河流最多的国家之一。中国有许多源远流长的大江大河。其中流域面积超过1000平方千米的河流就有2221条。常年水面面积1平方公里及以上天然湖泊2865个,湖泊水面总面积7.80万平方公里。其中,淡水湖1594个,咸水湖945个,盐湖166个,其他160个。随着经济社会快速发展,中国河湖管理保护出现了一些新问题,如河道干涸湖泊萎缩,水环境状况恶化,河湖功能退化等,对保障水安全带来

越界智能监测摄像机

随着科技的不断发展,越界智能监测摄像机 在安防领域得到了广泛应用。这种智能监测设备结合了图像识别技术和人工智能算法,旨在实现对区域内物体的越界行为进行监测和警示。通过高清晰度的摄像头捕捉到场景中的物体图像,并通过人工智能技术进行快速准确的边界检测,为安防管理提供重要支持。 首先,越界智能监测摄像机具有高效的图像识别功能。通过先进的图像处理算法,可以快速准确地识别出场景中的物体,并

第二章 可行性研究与软件开发计划简记

第二章  可行性研究与软件开发计划 可行性研究的任务:回答所开发的软件系统有无可行的解决办法或者这个系统值得开发么。 可行性研究大体可分为三个大的方面:工艺技术、市场需求、财务经济状况。 可行性研究的目的:就是尽可能的用最小的代价在尽可能短的时间内确定问题是否能解决。 可行性研究的解决方案:一般集中在 1.技术可行性2.经济可行性3.操作可行性。

软件工程技术专业软件开发综合实训室解决方案

一、行业背景与前景分析 1.1 软件工程技术专业就业前景 近年来,中国的软件行业取得了显著的成就,即便在全球经济受到新冠疫情冲击的情况下,仍保持了强劲的增长势头。据工业和信息化部发布的数据,2021年我国软件和信息技术服务业的业务收入达到85371亿元人民币,同比增长18.3%,远超同期国内生产总值的增长率。这一成就不仅体现了中国软件行业的韧性和发展潜力,也为未来的持续增长奠定了坚实的基