【QT】监听USB热插拔事件

28 篇文章 1 订阅

过滤Windows的事件消息,其中WM_DEVICECHANGE是设备发生变化时的Windows发给各个程序的事件消息,再通过wParam判断是设备插入(DBT_DEVICEARRIVAL)还是拔出(DBT_DEVICEREMOVECOMPLETE)。

在Qt中添加两个文件。

usb_listener.cpp
 

#include "usb_listener.h"
#include <QApplication>
#include <QDebug>
 
bool usb_listener::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
    MSG* msg = reinterpret_cast<MSG*>(message);
    unsigned int msgType = msg->message;
    if(msgType == WM_DEVICECHANGE) {
        emit DeviceChangeCbk();
        if(msg->wParam == DBT_DEVICEARRIVAL)
        {
            qDebug("usb in");
            emit DevicePlugIn();         //触发信号
        }
        if(msg->wParam == DBT_DEVICEREMOVECOMPLETE)
        {
            qDebug("usb out");
            emit DevicePlugOut();         //触发信号
        }
    }
    return QWidget::nativeEvent(eventType, message, result);
}
 
//触发信号
void usb_listener::EmitMySignal()
{
    emit DevicePlugIn();
}

usb_listener.h

#ifndef USB_LISTENER_H
#define USB_LISTENER_H
 
#include <QWidget>
#include <windows.h>
#include <QAbstractNativeEventFilter>
#include <dbt.h>
 
class usb_listener:public QWidget, public QAbstractNativeEventFilter
{
    Q_OBJECT
public:
    void EmitMySignal();
 
protected:
    bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
 
signals:
    void DeviceChangeCbk();
    void DevicePlugIn();
    void DevicePlugOut();
};
 
#endif // USB_LISTENER_H

如何使用

在pro文件中:

添加QT += serialport

在mainwindow中:

完成信号的连接

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include "qlabel.h"
#include <QDebug>
 
#include "usb_listener.h"
#include <QtSerialPort/QSerialPortInfo>
 
usb_listener *m_usb_listener = Q_NULLPTR;
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    m_usb_listener = new usb_listener;
    qApp->installNativeEventFilter(m_usb_listener);
    connect(m_usb_listener, &usb_listener::DevicePlugIn, [=](){
        //do something...
        qDebug("do something...");
    });
    m_usb_listener->EmitMySignal();     //手动触发一次
 
    //ui->label->setText("hello world");
    qDebug("hello");
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

 转自:【QT】监听USB热插拔事件_zzzw0的博客-CSDN博客_qt usb热插拔

其它相关链接:QT 监听 USB 设备 插入、拔出动作_Sunday的博客-CSDN博客_qt监听usb

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值