Qt上USB设备热插拔检测

C++ Qt是一个基于C++语言的跨平台应用程序开发框架,具有丰富的UI组件和API库。Qt包括了许多模块,如Qt Core、Qt GUI、Qt Network等,每个模块都提供了一系列的类和函数。Qt还提供了集成开发环境(IDE)Qt Creator,使得开发人员可以通过它来创建、编译、调试和部署Qt应用程序。 

学习Qt开发不知道做什么?我为大家整理的这些领域都涉及到Qt开发:嵌入式领域、桌面端开发、移动端、微控制器MCU、客户端(游戏、直播等等)、汽车领域行业、 消费类电子设备、医疗领域行业、工业自动化领域等等

1 头文件

#include <QWidget>
#include <dbt.h>
#include <windows.h>

Qt框架,GUI应用程序,跨平台开发,信号与槽机制,QML语言,模型视图编程,多线程编程,数据库编程,网络编程,XML解析,JSON解析,图形图像处理,用户界面设计,动画效果,OpenGL,WebKit,嵌入式开发,客户端/服务器应用程序.自定义控件QT6,C++语言基础,qt基础编程,qt软件开发,Qt架构设计,qt布局管理器,qt嵌入式开发,qt编程入门,qt数据库编程,qt跨平台框架,QT项目实战,Quick模块,OpenCV,Qt实战,OpenCV教程,QT界面开发,Qt框架,C++数据结构,Qt线程,桌面应用开发,qt桌面应用开发,Socket网络编程,qt开发工程师,qt开发,应用程序开发框架,图形视图框架,数据库编程,Qt开发编程,Qt开发控件,Qt开发工程师,QT开发必备技能栈,qt编码,qt网络编程,qt网络通信,Qt信号,Qt槽机制,qt字符串,qt数据类型,qt容器,qt客户端开发,qt软件工程师,qt页面绘制

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

2 示例代码

对于类 Form_usb头文件

#include "form_usb.h"
#include "ui_form_usb.h"
Form_usb::Form_usb(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form_usb)
{
ui->setupUi(this);
}
Form_usb::~Form_usb()
{
delete ui;
}
bool Form_usb::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
Q_UNUSED(eventType);
MSG* msg = reinterpret_cast<MSG*>(message);
int msgType = msg->message;
if(msgType == WM_DEVICECHANGE)
{
qDebug() << "Recv Event " ;
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
switch(msg->wParam)
{
case DBT_DEVICETYPESPECIFIC:
{
qDebug() << "DBT_DEVICETYPESPECIFIC " ;
break;
}
case DBT_DEVICEARRIVAL:
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags == 0)
{
// 插入U盘,此处可以做你想做的事
// lpdbv->dbcv_unitmask 即盘符标志位,1bit,0为A,1为B,10为C,11为D…以此类推
QString USBDisk = QString(this->FirstDriveFromMask(lpdbv->dbcv_unitmask));
qDebug() << "USB_Arrived and The USBDisk is: "<<USBDisk ;
}
}
qDebug() << "DBT_DEVICEARRIVAL" ;
break;
case DBT_DEVICEREMOVECOMPLETE:
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags == 0)
{
qDebug() << "USB_delete";
}
}
qDebug() << "DBT_DEVICEREMOVECOMPLETE" ;
break;
}
}
return false;
}
char Form_usb::FirstDriveFromMask(ULONG unitmask)
{
char i;

for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}

Qt框架,GUI应用程序,跨平台开发,信号与槽机制,QML语言,模型视图编程,多线程编程,数据库编程,网络编程,XML解析,JSON解析,图形图像处理,用户界面设计,动画效果,OpenGL,WebKit,嵌入式开发,客户端/服务器应用程序.自定义控件QT6,C++语言基础,qt基础编程,qt软件开发,Qt架构设计,qt布局管理器,qt嵌入式开发,qt编程入门,qt数据库编程,qt跨平台框架,QT项目实战,Quick模块,OpenCV,Qt实战,OpenCV教程,QT界面开发,Qt框架,C++数据结构,Qt线程,桌面应用开发,qt桌面应用开发,Socket网络编程,qt开发工程师,qt开发,应用程序开发框架,图形视图框架,数据库编程,Qt开发编程,Qt开发控件,Qt开发工程师,QT开发必备技能栈,qt编码,qt网络编程,qt网络通信,Qt信号,Qt槽机制,qt字符串,qt数据类型,qt容器,qt客户端开发,qt软件工程师,qt页面绘制

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

3. 进一步说明

主要是实现bool nativeEvent(const QByteArray &eventType, void *message, long *result);函数,来对设备的插拔事件进行监控。以上函数在Qt 5以上版本中受支持,其他版本使用的是函数

bool winEvent(MSG *message, long *result);。

对于部分事件类型现解释如下:

#define DBT_NO_DISK_SPACE 0x0047
#define DBT_LOW_DISK_SPACE 0x0048
#define DBT_CONFIGMGPRIVATE 0x7FFF
#define DBT_DEVICEARRIVAL 0x8000 ///一个设备或者"piece of media" 已经插入并且有效
#define DBT_DEVICEQUERYREMOVE 0x8001 ///移除设备需要请求权限,任何设备可以忽略并取消该请求
#define DBT_DEVICEQUERYREMOVEFAILED 0x8002 ///取消移除设备的请求
#define DBT_DEVICEREMOVEPENDING 0x8003 ///设备将会移除,不能被忽略
#define DBT_DEVICEREMOVECOMPLETE 0x8004 ///设备移除
#define DBT_DEVICETYPESPECIFIC 0x8005
#define DBT_CUSTOMEVENT 0x8006 ///用户事件发生
#define DBT_DEVTYP_OEM 0x00000000
#define DBT_DEVTYP_DEVNODE 0x00000001
#define DBT_DEVTYP_VOLUME 0x00000002 ///逻辑卷标事件触发
#define DBT_DEVTYP_PORT 0x00000003
#define DBT_DEVTYP_NET 0x00000004
#define DBT_DEVTYP_DEVICEINTERFACE 0x00000005
#define DBT_DEVTYP_HANDLE 0x00000006
#define DBT_DEVNODES_CHANGED 0x0007 ///设备插入或者移除系统,设备节点变化

Qt框架,GUI应用程序,跨平台开发,信号与槽机制,QML语言,模型视图编程,多线程编程,数据库编程,网络编程,XML解析,JSON解析,图形图像处理,用户界面设计,动画效果,OpenGL,WebKit,嵌入式开发,客户端/服务器应用程序.自定义控件QT6,C++语言基础,qt基础编程,qt软件开发,Qt架构设计,qt布局管理器,qt嵌入式开发,qt编程入门,qt数据库编程,qt跨平台框架,QT项目实战,Quick模块,OpenCV,Qt实战,OpenCV教程,QT界面开发,Qt框架,C++数据结构,Qt线程,桌面应用开发,qt桌面应用开发,Socket网络编程,qt开发工程师,qt开发,应用程序开发框架,图形视图框架,数据库编程,Qt开发编程,Qt开发控件,Qt开发工程师,QT开发必备技能栈,qt编码,qt网络编程,qt网络通信,Qt信号,Qt槽机制,qt字符串,qt数据类型,qt容器,qt客户端开发,qt软件工程师,qt页面绘制

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt中实现USB热插拔检测,可以使用QDeviceWatcher类。QDeviceWatcher是一个用于监测设备插入和移除事件的类。 首先,确保在项目文件(.pro)中添加以下内容以启用Qt的udev库: ```cpp LIBS += -ludev ``` 然后,可以按照以下步骤在Qt中实现USB热插拔检测: 1. 在头文件中包含必要的头文件: ```cpp #include <QObject> #include <QDeviceWatcher> ``` 2. 创建一个类并继承自QObject: ```cpp class USBWatcher : public QObject { Q_OBJECT public: explicit USBWatcher(QObject *parent = nullptr); private slots: void deviceAdded(const QString &devPath); void deviceRemoved(const QString &devPath); private: QDeviceWatcher *m_deviceWatcher; }; ``` 3. 在实现文件中定义构造函数,并在构造函数中初始化QDeviceWatcher对象,并连接相应的槽函数: ```cpp USBWatcher::USBWatcher(QObject *parent) : QObject(parent) { m_deviceWatcher = new QDeviceWatcher(this); connect(m_deviceWatcher, SIGNAL(deviceAdded(QString)), this, SLOT(deviceAdded(QString))); connect(m_deviceWatcher, SIGNAL(deviceRemoved(QString)), this, SLOT(deviceRemoved(QString))); m_deviceWatcher->start(); } ``` 4. 实现设备插入和移除的槽函数: ```cpp void USBWatcher::deviceAdded(const QString &devPath) { // 处理设备插入事件 qDebug() << "Device added: " << devPath; } void USBWatcher::deviceRemoved(const QString &devPath) { // 处理设备移除事件 qDebug() << "Device removed: " << devPath; } ``` 5. 在你的应用程序中实例化USBWatcher对象,并将其保持活动状态: ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); USBWatcher usbWatcher; return app.exec(); } ``` 通过以上步骤,你现在可以在`deviceAdded()`和`deviceRemoved()`槽函数中处理设备插入和移除事件。你可以根据需求来执行一些自定义的操作,比如更新UI或者执行特定的任务。 请注意,USB热插拔检测需要在具有相应权限的操作系统上运行,如Linux。在不同的操作系统和平台上,可能需要使用不同的方法来实现设备监测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值