Qt: usb热插拔检测(windows)

本文介绍了如何利用Qt的QAbstractNativeEventFilter在Windows环境下监听USB设备的插入和移除。通过创建一个继承自QWidget和QAbstractNativeEventFilter的UDisk类,重写nativeEventFilter方法,解析WM_DEVICECHANGE消息来识别USB设备的热插拔事件。然后在主程序中注册该事件过滤器以使其生效。
摘要由CSDN通过智能技术生成

Qt提供了QAbstractNativeEventFilter来实现本地时间得过滤,通过对本地事件的检测,判断usb热插拔;(这里是windows 的例子);

首先,以QWidget, QAbstractNativeEventFilter为基类建立子类,重定义nativeEventFilter:

1

virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);

譬如:建立UDisk类,  class UDisk : public QWidget, public QAbstractNativeEventFilter{}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

bool UDisk::nativeEventFilter(const QByteArray &eventType, void *message, long *result)

{

    MSG* msg = reinterpret_cast<MSG*>(message);

    int msgType = msg->message;

    if(msgType == WM_DEVICECHANGE) {                                  // 消息类型, 这里是设备变动;

        PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;

        switch (msg->wParam) {

        case DBT_DEVICEARRIVAL:

            if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) {

                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

                if(lpdbv->dbcv_flags ==0) {

                    QString USBDisk = QString(this->deviceMask(lpdbv ->dbcv_unitmask)) + ":/";

                    emit sigUDiskCome(USBDisk);

                }

            }

            break;

        case DBT_DEVICEREMOVECOMPLETE:

            if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) {

                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

                if(lpdbv->dbcv_flags == 0) {

                    QString USBDisk = QString(this->deviceMask(lpdbv ->dbcv_unitmask)) +":/";

                    emit sigUDiskRemove(USBDisk);

                }

            }

            break;

        case DBT_DEVNODES_CHANGED:

            break;

        default:

            break;

        }

    }

    return QWidget::nativeEvent(eventType, message, result);

}

在主程序中,还需要对该nativeEventFilter进行注册才能生效:

1

2

UDisk *pDisk = new UDisk;

qApp->installNativeEventFilter(pDisk);

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值