qt 显示插入U盘的信息

参考自 https://blog.csdn.net/u014597198/article/details/72820737

效果
在这里插入图片描述

udisk.h

#ifndef UDISK_H
#define UDISK_H
#include <QWidget>
#include <windows.h>
#include <QAbstractNativeEventFilter>
#include <dbt.h>

#define GB (1024 * 1024 * 1024)
#define MB (1024 * 1024)
#define KB (1024)



class uDisk : public QWidget, public QAbstractNativeEventFilter
{
    Q_OBJECT
protected:
    bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);

signals:
    void sigUDiskCome(QString uDiskName);
    void sigUDiskRemove();
private:
    char FirstDriveFromMask(ULONG unitmask);
public:
     ~uDisk();
    QStringList getDiskInfo(QString driver);
    quint64  getDiskFreeSpace(QString driver);

};


#endif // UDISK_H

udisk.cpp

#include <QApplication>
#include <QDebug>
#include "udisk.h"
#include "global_api.h"


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

uDisk::~uDisk()
{

}


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->FirstDriveFromMask(lpdbv ->dbcv_unitmask));
                        qDebug() << __FUNCTION__ << __LINE__ << USBDisk;
                        DiskUrl = USBDisk;
                        qDebug() << __FUNCTION__ << __LINE__ << DiskUrl;
                        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)
                    {
                        emit sigUDiskRemove();
                    }
                }
                break;

            case DBT_DEVNODES_CHANGED:
                break;
            default:
                break;
            }
    }

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

QStringList uDisk::getDiskInfo( QString driver )
{
    QStringList	diskmsg;
    LPCWSTR		lpcwstrDriver = (LPCWSTR) driver.utf16();

    ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;

    if ( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes ) )
    {
        qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";
        diskmsg << "Error";
    }

//    qDebug() << "liFreeBytesAvailable" <<(quint64) liFreeBytesAvailable.QuadPart/1024/1024/1024 ;
//    qDebug() << "liTotalBytes" << (quint64) liTotalBytes.QuadPart/1024/1024/1024 ;
//    quint64 liTotal = ((quint64) liTotalBytes.QuadPart/1024/1024/1024);
//    QString liTotal_msg = tr("%1").arg(liTotal);
//    qDebug() << "liTotal_msg" <<liTotal_msg;

//    qDebug() << "liTotalFree" << ((quint64) liTotalFreeBytes.QuadPart/1024/1024/1024) ;
//    quint64 liFreeTotal = ((quint64) liTotalFreeBytes.QuadPart/1024/1024/1024);
//    QString liFreeTotal_msg = tr("%1").arg(liFreeTotal);
//    qDebug() << "liFreeTotal_msg" <<liTotal_msg;
//    diskmsg << liTotal_msg << liFreeTotal_msg;
//    qDebug() << diskmsg;



    QString use = QString::number( (double) (liTotalBytes.QuadPart - liTotalFreeBytes.QuadPart) / GB, 'f', 2 );
    use = use + "G";
    QString free = QString::number( (double) liTotalFreeBytes.QuadPart / GB, 'f', 2 );
    free = free + "G";
    QString all = QString::number( (double) liTotalBytes.QuadPart / GB, 'f', 2 );
    all = all + "G";
    int	percent	= 100 - ( (double) liTotalFreeBytes.QuadPart / liTotalBytes.QuadPart) * 100; /* 剩余百分比 */
    QString percent_str	= QString::number( percent, 10 );
//    qDebug() << "--------------------------------------------";
//    myDebug( "use", use );
//    myDebug( "free", free );
//    myDebug( "all", all );
//    myDebug( "percent_str", percent_str );
    diskmsg << use << free << all << percent_str;
    myDebug( "diskmsg", diskmsg );

    return(diskmsg);
}

quint64 uDisk::getDiskFreeSpace(QString driver)
{
    LPCWSTR lpcwstrDriver=(LPCWSTR)driver.utf16();

    ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;

    if( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) )
    {
     qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";
     return 0;
    }
    return (quint64) liTotalFreeBytes.QuadPart/1024/1024/1024;
}

如何使用:

1、引用头文件#include “uDisk.h”

2、声明uDisk *m_uDisk = Q_NULLPTR;

3、调用:

    m_uDisk = new uDisk;
    qApp->installNativeEventFilter(m_uDisk);
    connect(m_uDisk, &uDisk::sigUDiskCome, [=](QString uDiskName)
    {
        ui->label->setText(tr("U Disk Come!").append(tr("The Disk is ") + uDiskName));
    });
    connect(m_uDisk, &uDisk::sigUDiskRemove, [=]()
    {
        ui->label->setText(tr("U Disk Remove!"));
    });

4、在调用类析构时记得析构掉:

if(m_uDisk) 
{
    delete m_uDisk;
    m_uDisk = Q_NULLPTR;
}

例子

{
    ui->setupUi(this);

    ui->progressBar->hide();
    ui->label_mem_info->hide();

    uDisk *m_uDisk = Q_NULLPTR;
    m_uDisk = new uDisk;
    qApp->installNativeEventFilter(m_uDisk);
    QString current_uDiskName;
    connect(m_uDisk, &uDisk::sigUDiskCome, [=](QString uDiskName)
    {
        ui->label_sd_info->setText(tr("U盘已插入!").append(tr(" 盘符为:") + uDiskName));
        QStringList DiskInfo =  m_uDisk->getDiskInfo(QString(uDiskName + ":/"));
        myDebug("DiskInfo",DiskInfo);

        //显示内存信息
        ui->progressBar->show();
        ui->label_mem_info->show();

        //设置进度条的显示
        int progressBarValue = DiskInfo.last().toInt();
        ui->progressBar->setRange(0,100);
        ui->progressBar->setValue(progressBarValue);

        //显示存储状态信息
        QString use = DiskInfo.at(0); //use
        QString free = DiskInfo.at(1); //free
        QString total = DiskInfo.at(2); //total
        qDebug() << use << free << total;
        QString disk_info_show = free + "可用, "  + "共" + total + ".";
        qDebug() << disk_info_show;
        ui->label_mem_info->setText(disk_info_show);

    });
    connect(m_uDisk, &uDisk::sigUDiskRemove, [=]()
    {
        ui->label_sd_info->setText(tr("U Disk Remove!"));
        ui->progressBar->hide();
        ui->label_mem_info->hide();
    });

}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值