QT做一个USB HID设备识别软件

1.下载 HidApi库:GitHub - yigityuce/HidApi: Human Interface Device Api (HidApi) with C++

2.pro文件添加

复制代码
DEFINES -= UNICODE
LIBS += -lsetupapi

3.h文件

复制代码
#ifndef My_Usb_Hid_Device_H
#define My_Usb_Hid_Device_H

#include <QWidget>
#include <QString>
#include <QDir>
#include <QFileDialog>
#include <QDebug>
#include "Redefine/MyTextEdit.h"
#include "Redefine/MyLabel.h"
#include "Redefine/MyToolButton.h"
#include "UsbHidApi/HidApi.h"
#include "Redefine/MyComboBox.h"

class My_Usb_Hid_Device: public QWidget
{
public:
    My_Usb_Hid_Device();
    void setParent(QWidget *parent);
    void resize(int w, int h);

    void Open_File_Button_Clicked();
    void Open_Device_Button_Clicked();
    void Clear_Button_Clicked();
    void USB_HID_Listen_Clicked();

    QString FilePath;
    QString FileString;
    int Get_File_Size;
    bool USB_HID_DEVICE_IsOpen = false;

    HidApi hidApi;
    HidDevice hidDev;//HID设备
    HidDeviceList devList;//HID设备列表
    HidDeviceList Last_devList;//HID设备列表

    MyLabel Update_File_Path_Lable;
    MyTextEdit File_Path_Edit;
    MyToolButton Open_File_Button;

    MyComboBox Usb_PidVid_Box;
    MyLabel Pid_Lable;
    MyLabel Vid_Lable;
    QTextEdit Pid_Edit;
    QTextEdit Vid_Edit;
    MyComboBox Usb_Type_Box;
    MyToolButton Open_Device_Button;
    MyToolButton Clear_Button;

    QTextEdit Out_Edit;
};

#endif // My_Usb_Hid_Device_H

4.CPP文件

复制代码
#include "My_Usb_Hid_Device.h"

My_Usb_Hid_Device::My_Usb_Hid_Device()
{
    FilePath = QDir::homePath();
    FilePath += "/Desktop/";
    File_Path_Edit.setText(FilePath);

    hidApi.isInitialized();
    Last_devList = devList = hidApi.scanDevices();
    for(size_t i = 0; i < devList.size(); i++)//可打印扫描到的设备的信息
    {
        qDebug() << i + 1 << ". DEVICE\n";
        qDebug() << "Path        : " << devList[i].getPath().c_str();
        qDebug() << "Vendor Id   : " << devList[i].getVendorId();
        qDebug() << "Product Id  : " << devList[i].getProductId();
        //qDebug() << "Serial      : " << devList[i].getSerial();
        //qDebug() << "Manufacturer: " << devList[i].getManufacturer();
        //qDebug() << "Product     : " << devList[i].getProductString();
        qDebug() << "Release No  : " << devList[i].getRelease();
        qDebug() << "Usage Page  : " << devList[i].getUsagePage();
        qDebug() << "Usage       : " << devList[i].getUsage();
        qDebug() << "Interface   : " << devList[i].getInterface();
        qDebug() << "-----------------------------------------------";

        Out_Edit.append(QString("%1").arg(i) + ". DEVICE");
        Out_Edit.append(devList[i].getPath().c_str());
        Out_Edit.append("Serial      : " + QString::fromStdWString(devList[i].getSerial()));
        Out_Edit.append("Manufacturer: " + QString::fromStdWString(devList[i].getManufacturer()));
        Out_Edit.append("Product     : " + QString::fromStdWString(devList[i].getProductString()));
        Out_Edit.append("Vendor Id   : " + QString("0X%1").arg(devList[i].getVendorId(), 4, 16, QLatin1Char('0')));
        Out_Edit.append("Product Id  : " + QString("0X%1").arg(devList[i].getProductId(),4, 16, QLatin1Char('0')));
        Out_Edit.append("Release No  : " + QString("%1").arg(devList[i].getRelease(),    4, 10, QLatin1Char('0')));
        Out_Edit.append("Usage Page  : " + QString("%1").arg(devList[i].getUsagePage(),  4, 10, QLatin1Char('0')));
        Out_Edit.append("Usage       : " + QString("%1").arg(devList[i].getUsage(),      4, 10, QLatin1Char('0')));
        Out_Edit.append("Interface   : " + QString("%1").arg(devList[i].getInterface(),  4, 10, QLatin1Char('0')));
        Out_Edit.append(0);

        //Usb_PidVid_Box.addItem(QString("%1").arg(i));
        Usb_PidVid_Box.addItem(QString::fromStdWString(devList[i].getManufacturer()) + ":VID:" + QString("%1").arg(devList[i].getVendorId()) + "PID:" + QString("%1").arg(devList[i].getProductId()));
    }
}

void My_Usb_Hid_Device::setParent(QWidget *parent)
{
    Update_File_Path_Lable.setParent(parent);
    Update_File_Path_Lable.setText("升级文件路径");
    File_Path_Edit.setParent(parent);
    Open_File_Button.setParent(parent);
    Open_File_Button.setText("打开文件");

    Usb_PidVid_Box.setParent(parent);
    Pid_Lable.setParent(parent);
    Pid_Lable.setText("PID");
    Vid_Lable.setParent(parent);
    Vid_Lable.setText("VID");
    Pid_Edit.setParent(parent);
    Vid_Edit.setParent(parent);
    Usb_Type_Box.setParent(parent);
    Open_Device_Button.setParent(parent);
    Open_Device_Button.setText("打开设备");
    Clear_Button.setParent(parent);
    Clear_Button.setText("清除显示");

    Usb_Type_Box.addItem(QString("系统设备"));
    Usb_Type_Box.addItem(QString("自定义设备"));

    QFont Font;
    Font.setPixelSize(30);
    Pid_Edit.setAlignment(Qt::AlignCenter);
    Pid_Edit.setFont(Font);
    Vid_Edit.setAlignment(Qt::AlignCenter);
    Vid_Edit.setFont(Font);

    Out_Edit.setParent(parent);
}


void My_Usb_Hid_Device::resize(int w, int h)
{
    int Lable_Y = (h / 10);

    int Path_Edit_X = (w / 10) * 4;
    int Path_Edit_Y = Lable_Y;

    int Show_Edit_X = w;
    int Show_Edit_Y = h - Lable_Y * 2;

    int Button_X = (w / 10) * 1;
    int Button_Y = Lable_Y;

    Update_File_Path_Lable.resize(Path_Edit_X, Path_Edit_Y);
    Update_File_Path_Lable.move(0, 0);

    File_Path_Edit.resize(Path_Edit_X, Path_Edit_Y);
    File_Path_Edit.move(Path_Edit_X, 0);

    Open_File_Button.resize(Button_X * 2, Button_Y);
    Open_File_Button.move(Path_Edit_X * 2, 0);

    Usb_PidVid_Box.resize(Button_X * 3, Button_Y);
    Usb_PidVid_Box.move(0, Lable_Y);

    Pid_Lable.resize(Button_X, Button_Y);
    Pid_Lable.move(Button_X * 3, Lable_Y);

    Pid_Edit.resize(Button_X, Button_Y);
    Pid_Edit.move(Button_X * 4, Lable_Y);

    Vid_Lable.resize(Button_X, Button_Y);
    Vid_Lable.move(Button_X * 5, Lable_Y);

    Vid_Edit.resize(Button_X, Button_Y);
    Vid_Edit.move(Button_X * 6, Lable_Y);

    Usb_Type_Box.resize(Button_X, Button_Y);
    Usb_Type_Box.move(Button_X * 7, Lable_Y);

    Open_Device_Button.resize(Button_X, Button_Y);
    Open_Device_Button.move(Button_X * 8, Lable_Y);

    Clear_Button.resize(Button_X, Button_Y);
    Clear_Button.move(Button_X * 9, Lable_Y);

    Out_Edit.resize(Show_Edit_X, Show_Edit_Y);
    Out_Edit.move(0, Path_Edit_Y + Lable_Y);
}

void My_Usb_Hid_Device::Open_File_Button_Clicked()
{
    FilePath = QFileDialog::getOpenFileName(this, "打开文件", FilePath, "*.bin;;*.hex");

    File_Path_Edit.setText(FilePath);
    if(FilePath.isEmpty())
    {
        //QMessageBox::warning(this,"警告","没有选择文件");
        return;
    }
    else
    {

    }
}

void My_Usb_Hid_Device::Open_Device_Button_Clicked()
{
    hidDev = devList[Usb_PidVid_Box.currentIndex()];

    if(hidDev.isInitialized())
    {
        if(USB_HID_DEVICE_IsOpen == true)
        {
            USB_HID_DEVICE_IsOpen = false;
            Open_Device_Button.setText("打开设备");
            hidDev.close();
        }
        else
        {
            USB_HID_DEVICE_IsOpen = hidDev.open();
            if(USB_HID_DEVICE_IsOpen)
            {
                USB_HID_DEVICE_IsOpen = true;
                Open_Device_Button.setText("关闭设备");

                if(hidDev.readAvailable())//假如有数据可读
                {
                    std::string ring = hidDev.read(-1);//从设备读取数据
                }
            }
        }
    }
    Out_Edit.clear();
    Out_Edit.append("Manufacturer: " + QString::fromStdWString(devList[Usb_PidVid_Box.currentIndex()].getManufacturer()));
    Out_Edit.append("Vendor Id   : " + QString("0X%1").arg(devList[Usb_PidVid_Box.currentIndex()].getVendorId(), 4, 16, QLatin1Char('0')));
    Out_Edit.append("Product Id  : " + QString("0X%1").arg(devList[Usb_PidVid_Box.currentIndex()].getProductId(),4, 16, QLatin1Char('0')));

    //hidDev.close();
}

void My_Usb_Hid_Device::Clear_Button_Clicked()
{
    Out_Edit.clear();
}

void My_Usb_Hid_Device::USB_HID_Listen_Clicked()
{
    devList = hidApi.scanDevices();
    if(Last_devList.size() != devList.size())
    {
        Last_devList = devList;

        Usb_PidVid_Box.clear();
        for(size_t i = 0; i < devList.size(); i++)//可打印扫描到的设备的信息
        {
            Out_Edit.append(QString("%1").arg(i) + ". DEVICE");
            Out_Edit.append(devList[i].getPath().c_str());
            Out_Edit.append("Serial      : " + QString::fromStdWString(devList[i].getSerial()));
            Out_Edit.append("Manufacturer: " + QString::fromStdWString(devList[i].getManufacturer()));
            Out_Edit.append("Product     : " + QString::fromStdWString(devList[i].getProductString()));
            Out_Edit.append("Vendor Id   : " + QString("0X%1").arg(devList[i].getVendorId(), 4, 16, QLatin1Char('0')));
            Out_Edit.append("Product Id  : " + QString("0X%1").arg(devList[i].getProductId(),4, 16, QLatin1Char('0')));
            Out_Edit.append("Release No  : " + QString("%1").arg(devList[i].getRelease(),    4, 10, QLatin1Char('0')));
            Out_Edit.append("Usage Page  : " + QString("%1").arg(devList[i].getUsagePage(),  4, 10, QLatin1Char('0')));
            Out_Edit.append("Usage       : " + QString("%1").arg(devList[i].getUsage(),      4, 10, QLatin1Char('0')));
            Out_Edit.append("Interface   : " + QString("%1").arg(devList[i].getInterface(),  4, 10, QLatin1Char('0')));
            Out_Edit.append(0);

            Usb_PidVid_Box.addItem(QString::fromStdWString(devList[i].getManufacturer()) + ":VID:" + QString("%1").arg(devList[i].getVendorId()) + "PID:" + QString("%1").arg(devList[i].getProductId()));
        }
    }
}

5.看看效果

相关推荐
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法
echoarts2 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix2 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题2 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说2 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔2 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号2 天前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_2 天前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty2 天前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再2 天前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame