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

Qt 获取当前系统中连接的所有USB设备的信息 lsusb版

Qt 获取当前系统中连接的所有USB设备的信息 lsusb版

flyfish

环境
Ubuntu22.04
Qt 6.2.4

实现的功能

枚举USB设备:使用lsusb命令获取当前系统中连接的所有USB设备的信息。
解析设备信息:将lsusb命令的输出按行分割,并提取每行中的总线号、设备号和设备描述。
写入文件:将提取的设备信息写入指定的文本文件中。

#include <QCoreApplication>
#include <QProcess>
#include <QStringList>
#include <QTextStream>
#include <QDebug>
#include <QFile>

// 枚举USB设备并将结果写入文件
void enumerateUSBDevices(const QString &outputFilePath) {
    // 创建一个QProcess对象,用于执行外部命令
    QProcess process;

    // 启动lsusb命令
    process.start("lsusb");
    if (!process.waitForStarted()) {  // 等待命令启动
        qCritical() << "Failed to start lsusb command";  // 如果命令启动失败,输出错误信息
        return;
    }

    if (!process.waitForFinished()) {  // 等待命令执行完成
        qCritical() << "Failed to finish lsusb command";  // 如果命令执行失败,输出错误信息
        return;
    }

    // 获取命令的输出
    QString output = process.readAllStandardOutput();  // 读取命令的标准输出
    QStringList lines = output.split('\n');  // 将输出按行分割

    // 打开输出文件
    QFile file(outputFilePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {  // 以写入文本模式打开文件
        qCritical() << "Failed to open file for writing:" << outputFilePath;  // 如果文件打开失败,输出错误信息
        return;
    }

    // 创建文本流,用于写入文件
    QTextStream out(&file);

    // 遍历每一行输出
    foreach (const QString &line, lines) {
        if (!line.isEmpty()) {  // 跳过空行
            // 分割行以提取设备信息
            QStringList parts = line.split(' ');  // 按空格分割行
            QString bus = parts[1];  // 提取总线号
            QString device = parts[3].mid(0, 3);  // 提取设备号
            QString description = line.mid(line.indexOf(parts[5]));  // 提取设备描述

            // 打印设备信息
            qDebug() << "Bus:" << bus << "Device:" << device << "Description:" << description;

            // 写入文件
            out << "Bus: " << bus << " Device: " << device << " Description: " << description << "\n";
        }
    }

    // 关闭文件
    file.close();
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);  // 创建QCoreApplication对象,用于管理应用程序的事件循环

    // 枚举USB设备并将结果写入文件
    QString outputFilePath = "usb_devices.txt";  // 指定输出文件路径
    enumerateUSBDevices(outputFilePath);  // 调用函数枚举USB设备

    qDebug() << "USB devices have been enumerated and written to" << outputFilePath;  // 输出提示信息

    // 如果不需要事件循环,可以直接退出
    return 0;
}

涉及的Qt函数及其作用
QProcess:

QProcess process;:创建一个QProcess对象,用于执行外部命令。
process.start("lsusb");:启动lsusb命令。
process.waitForStarted();:等待命令启动。
process.waitForFinished();:等待命令执行完成。
process.readAllStandardOutput();:读取命令的标准输出。

QString:

QString output = process.readAllStandardOutput();:将命令的输出读取为QString。
QStringList lines = output.split('\n');:将字符串按行分割为QStringList。
QStringList:
QStringList parts = line.split(' ');:将字符串按空格分割为QStringList。

QFile:

QFile file(outputFilePath);:创建一个QFile对象,用于操作文件。
file.open(QIODevice::WriteOnly | QIODevice::Text);:以写入文本模式打开文件。
file.close();:关闭文件。

QTextStream:

QTextStream out(&file);:创建一个QTextStream对象,用于写入文件。
out << "Bus: " << bus << " Device: " << device << " Description: " << description << "\n";:将设备信息写入文件。

qDebug 和 qCritical:

qDebug() << "Bus:" << bus << "Device:" << device << "Description:" << description;:输出调试信息。
qCritical() << "Failed to start lsusb command";:输出错误信息。

QCoreApplication:

QCoreApplication a(argc, argv);:创建一个QCoreApplication对象,用于管理应用程序的事件循环。
return a.exec();:启动事件循环。在这个示例中,我们不需要事件循环,所以直接返回0

http://www.kler.cn/a/391542.html

相关文章:

  • 【Vue】Vue3.0(十九)Vue 3.0 中一种组件间通信方式-自定义事件
  • win32 / WTL 开发多线程应用,子线程传递大对象给UI线程(主窗口)的方法
  • 什么是RAG? LangChain的RAG实践!
  • 【AI换装整合包及教程】CatVTON与其他虚拟试衣技术的详细对比
  • 欧国联的规则,你都了解吗?
  • 自动驾驶3D目标检测综述(一)
  • Spring Boot编程训练系统:架构设计与技术选型
  • creo toolkit二次开发学习之获取任意选择模型作为元件,并进行获取约束等
  • 6.2 对角化矩阵(1)
  • 【机器学习导引】ch6-支持向量机
  • RabbitMQ队列详细属性(重要)
  • 【MATLAB源码-第215期】基于matlab的8PSK调制CMA均衡和RLS-CMA均衡对比仿真,对比星座图和ISI。
  • Django前后端分离基本流程
  • 计算机网络:运输层 —— 运输层端口号
  • 解决全局安装@vue/cli 后vue -V不是内部或外部命令
  • JVM(二、类加载系统)
  • 20. 类模板
  • SpringBoot Tomcat 请求处理全流程详解
  • 汇川PLC EtherNET/IP无线通信,开启国产工控无线互联新时代
  • SASS 控制指令详解@for、@if、@each、@while
  • 面试问答:TCP协议中的三开四断,三次握手四次挥手
  • 关于CSS表达使中使用的 max() 函数
  • sqlite3数据库的相关API使用
  • 二叉树的前序遍历---一个简单高效的算法
  • 以数字产业园区规划为笔,绘智慧城市新篇章
  • 【ExcelWPS如何对工作表和文档进行加密保护】