linux qt 获取u盘名称,QT windows平台下获取U盘 QComboBox显示U盘盘符

在windows平台下获取U盘信息,可以调用windows API函数比较方便。本来想用qt

来写的,网上关于这方面的代码比较多,但按照提示的步骤来写的就是无法编译,我也不知道为什么。如果有知道的朋友,留言给我或者qq 1585519210联系

在windows平台下U盘检测采用windows事件来设计,废话少说,上代码!

#ifndef GETUSBDISKWIDGET_H

#define GETUSBDISKWIDGET_H

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

namespace Ui {

class GetUsbDiskWidget;

}

typedef struct USB_DISK_INFO

{

QString DirPath;

float TotalMemory;

float FreeMemory;

}USB_DISK_INFO;

class GetUsbDiskWidget : public QWidget

{

Q_OBJECT

public:

explicit GetUsbDiskWidget(QWidget *parent = 0);

~GetUsbDiskWidget();

void Init();

void ScanHD();

void AddDisk(QString &DiskName);

void DeleteDisk(QString &DiskName);

bool SearchDisk(QString &DiskName,int &iter);

void GetMemorySize(USB_DISK_INFO & disk);

void AddComboBoxItem(QString &item);

void DeleteComboBoxItem(QString &item);

bool winEvent(MSG *message, long *result);

char FirstDriveFromMask (ULONG unitmask);

USB_DISK_INFO GetCheckedDisk();

private:

Ui::GetUsbDiskWidget *ui;

QVector usb_disk_info;

USB_DISK_INFO CurrentUseDisk;

private slots:

void on_comboBox_USB_currentIndexChanged(QString );

};

#endif // GETUSBDISKWIDGET_H

#include "getusbdiskwidget.h"

#include "ui_getusbdiskwidget.h"

#include

GetUsbDiskWidget::GetUsbDiskWidget(QWidget *parent) :

QWidget(parent),

ui(new Ui::GetUsbDiskWidget)

{

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gb18030"));

QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb18030"));

QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));

ui->setupUi(this);

this->Init();

}

GetUsbDiskWidget::~GetUsbDiskWidget()

{

delete ui;

}

//=================================================================================

//系统初始化

//=================================================================================

void GetUsbDiskWidget::Init()

{

this->ScanHD();

ui->comboBox_USB->clear();

this->usb_disk_info.clear();

}

//=================================================================================

//系统启动扫描已经连接的U盘 程序只会在系统执行时执行一次

//=================================================================================

void GetUsbDiskWidget::ScanHD()

{

qDebug()<

char diskPath[5] = { 0 };

DWORD allDisk = GetLogicalDrives(); //返回一个32位整数,将他转换成二进制后,表示磁盘,最低位为A盘

if (allDisk!=0)

{

for (int i=0;i<13;i++) //假定最多有12个磁盘从A开始计数

{

if ((allDisk & 1)==1)

{

sprintf( diskPath, "%c", 'A'+i );

strcat( diskPath, ":" );

LPCWSTR RootPathName =(LPCWSTR)QString(diskPath).utf16();

if (GetDriveType(RootPathName) == DRIVE_REMOVABLE)

{

if( GetVolumeInformation(RootPathName,0,0,0,0,0,0,0) ) //判断驱动是否准备就绪

{

qDebug()<

QString path(diskPath);

this->AddDisk(path);

}

}

}

allDisk = allDisk>>1;

}

}

}

//=================================================================================

//增加移动设备

//=================================================================================

void GetUsbDiskWidget::AddDisk(QString &DiskName)

{

int iter = 0;

if(SearchDisk(DiskName,iter))

{

return ;

}

USB_DISK_INFO usbtemp;

usbtemp.DirPath = DiskName;

GetMemorySize(usbtemp);//获取设备内存信息

this->usb_disk_info.push_back(usbtemp);

this->AddComboBoxItem(DiskName);

}

//=================================================================================

//删除移动设备

//=================================================================================

void GetUsbDiskWidget::DeleteDisk(QString &DiskName)

{

int iter = 0;

if(SearchDisk(DiskName,iter))

{

this->usb_disk_info.remove(iter);

this->DeleteComboBoxItem(DiskName);

}

}

//=================================================================================

//搜索移动设备

//=================================================================================

bool GetUsbDiskWidget::SearchDisk(QString &DiskName, int &iter)

{

for(int i = 0;i < this->usb_disk_info.size();i++)

{

if(usb_disk_info.at(i).DirPath.compare(DiskName) == 0)

{

iter = i;

return true;

}

}

return false;

}

//=================================================================================

//获取设备的内存信息

//=================================================================================

void GetUsbDiskWidget::GetMemorySize(USB_DISK_INFO &disk)

{

ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;

LPCWSTR lpcwstrDriver=(LPCWSTR)disk.DirPath.utf16();

if( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) )

{

qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";

return ;

}

disk.FreeMemory = (float)liTotalFreeBytes.QuadPart/1024/1024/1024; //剩余内存

disk.TotalMemory = (float)liTotalBytes.QuadPart/1024/1024/1024; //总内存

}

//=================================================================================

//过滤windows的U盘插入事件

//=================================================================================

bool GetUsbDiskWidget::winEvent(MSG *message, long *result)

{

QString DirPath;

int msgType = message->message;

if(msgType == WM_DEVICECHANGE)

{

qDebug()<< "winEvent in MgFrame : WM_DEVICECHANGE" ;

PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)message->lParam;

switch(message->wParam)

{

case DBT_DEVICEARRIVAL:

if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)

{

PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

if (lpdbv -> dbcv_flags == 0)

{

//插入U盘,获取盘符

DirPath = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask));

DirPath += ":";

this->AddDisk(DirPath);

qDebug()<USBDisk Path ="<

}

}

break;

case DBT_DEVICEREMOVECOMPLETE:

if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)

{

PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;

if (lpdbv -> dbcv_flags == 0)

{

qDebug() << "USB_Removed";

DirPath = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask));

DirPath += ":";

this->DeleteDisk(DirPath);

qDebug()<

}

}

break;

}

}

return false;

}

//=================================================================================

//U盘盘符计算

//=================================================================================

char GetUsbDiskWidget::FirstDriveFromMask(ULONG unitmask)

{

char i;

for (i = 0; i < 26; ++i)

{

if (unitmask & 0x1)

break;

unitmask = unitmask >> 1;

}

return (i + 'A');

}

//=================================================================================

//增加下拉列表选项

//=================================================================================

void GetUsbDiskWidget::AddComboBoxItem(QString &item)

{

QStringList ComboboxList = QStringList()<

//ComboboxList<

ui->comboBox_USB->addItems(ComboboxList);

}

//=================================================================================

//删除下拉列表选项

//=================================================================================

void GetUsbDiskWidget::DeleteComboBoxItem(QString &item)

{

int i = ui->comboBox_USB->findText(item);

ui->comboBox_USB->removeItem(i);

}

//=================================================================================

//下拉列表选项发生改变

//=================================================================================

void GetUsbDiskWidget::on_comboBox_USB_currentIndexChanged(QString e)

{

qDebug()<

int iter;

if(this->SearchDisk(e,iter))

{

this->CurrentUseDisk = this->usb_disk_info.at(iter);

}

}

//=================================================================================

//获取下拉列表当前选定的U盘

//=================================================================================

USB_DISK_INFO GetUsbDiskWidget::GetCheckedDisk()

{

return this->CurrentUseDisk;

}

#include

#include "getusbdiskwidget.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

GetUsbDiskWidget w;

w.show();

return a.exec();

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值