Qt 获取当前系统中连接的所有USB设备的信息 lsusb版
flyfish
环境
Ubuntu22.04
Qt 6.2.4
实现的功能
枚举USB设备:使用lsusb命令获取当前系统中连接的所有USB设备的信息。
解析设备信息:将lsusb命令的输出按行分割,并提取每行中的总线号、设备号和设备描述。
写入文件:将提取的设备信息写入指定的文本文件中。
c
#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:
c
QProcess process;:创建一个QProcess对象,用于执行外部命令。
process.start("lsusb");:启动lsusb命令。
process.waitForStarted();:等待命令启动。
process.waitForFinished();:等待命令执行完成。
process.readAllStandardOutput();:读取命令的标准输出。
QString:
c
QString output = process.readAllStandardOutput();:将命令的输出读取为QString。
QStringList lines = output.split('\n');:将字符串按行分割为QStringList。
QStringList:
QStringList parts = line.split(' ');:将字符串按空格分割为QStringList。
QFile:
c
QFile file(outputFilePath);:创建一个QFile对象,用于操作文件。
file.open(QIODevice::WriteOnly | QIODevice::Text);:以写入文本模式打开文件。
file.close();:关闭文件。
QTextStream:
c
QTextStream out(&file);:创建一个QTextStream对象,用于写入文件。
out << "Bus: " << bus << " Device: " << device << " Description: " << description << "\n";:将设备信息写入文件。
qDebug 和 qCritical:
c
qDebug() << "Bus:" << bus << "Device:" << device << "Description:" << description;:输出调试信息。
qCritical() << "Failed to start lsusb command";:输出错误信息。
QCoreApplication:
c
QCoreApplication a(argc, argv);:创建一个QCoreApplication对象,用于管理应用程序的事件循环。
return a.exec();:启动事件循环。在这个示例中,我们不需要事件循环,所以直接返回0。