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();
});
}
还没有评论,来说两句吧...