qt 显示插入U盘的信息

墨蓝 2024-04-19 12:50 140阅读 0赞

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

效果
在这里插入图片描述

udisk.h

  1. #ifndef UDISK_H
  2. #define UDISK_H
  3. #include <QWidget>
  4. #include <windows.h>
  5. #include <QAbstractNativeEventFilter>
  6. #include <dbt.h>
  7. #define GB (1024 * 1024 * 1024)
  8. #define MB (1024 * 1024)
  9. #define KB (1024)
  10. class uDisk : public QWidget, public QAbstractNativeEventFilter
  11. {
  12. Q_OBJECT
  13. protected:
  14. bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
  15. signals:
  16. void sigUDiskCome(QString uDiskName);
  17. void sigUDiskRemove();
  18. private:
  19. char FirstDriveFromMask(ULONG unitmask);
  20. public:
  21. ~uDisk();
  22. QStringList getDiskInfo(QString driver);
  23. quint64 getDiskFreeSpace(QString driver);
  24. };
  25. #endif // UDISK_H

udisk.cpp

  1. #include <QApplication>
  2. #include <QDebug>
  3. #include "udisk.h"
  4. #include "global_api.h"
  5. char uDisk::FirstDriveFromMask( ULONG unitmask )
  6. {
  7. char i;
  8. for ( i = 0; i < 26; ++i )
  9. {
  10. if ( unitmask & 0x1 )
  11. {
  12. break;
  13. }
  14. unitmask = unitmask >> 1;
  15. }
  16. return(i + 'A');
  17. }
  18. uDisk::~uDisk()
  19. {
  20. }
  21. bool uDisk::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
  22. {
  23. MSG* msg = reinterpret_cast<MSG*>(message);
  24. int msgType = msg->message;
  25. if(msgType == WM_DEVICECHANGE)
  26. {
  27. PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
  28. switch (msg->wParam)
  29. {
  30. case DBT_DEVICEARRIVAL:
  31. if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
  32. {
  33. PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
  34. if(lpdbv->dbcv_flags ==0)
  35. {
  36. QString USBDisk = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask));
  37. qDebug() << __FUNCTION__ << __LINE__ << USBDisk;
  38. DiskUrl = USBDisk;
  39. qDebug() << __FUNCTION__ << __LINE__ << DiskUrl;
  40. emit sigUDiskCome(USBDisk);
  41. }
  42. }
  43. break;
  44. case DBT_DEVICEREMOVECOMPLETE:
  45. if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
  46. {
  47. PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
  48. if(lpdbv->dbcv_flags == 0)
  49. {
  50. emit sigUDiskRemove();
  51. }
  52. }
  53. break;
  54. case DBT_DEVNODES_CHANGED:
  55. break;
  56. default:
  57. break;
  58. }
  59. }
  60. return QWidget::nativeEvent(eventType, message, result);
  61. }
  62. QStringList uDisk::getDiskInfo( QString driver )
  63. {
  64. QStringList diskmsg;
  65. LPCWSTR lpcwstrDriver = (LPCWSTR) driver.utf16();
  66. ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;
  67. if ( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes ) )
  68. {
  69. qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";
  70. diskmsg << "Error";
  71. }
  72. // qDebug() << "liFreeBytesAvailable" <<(quint64) liFreeBytesAvailable.QuadPart/1024/1024/1024 ;
  73. // qDebug() << "liTotalBytes" << (quint64) liTotalBytes.QuadPart/1024/1024/1024 ;
  74. // quint64 liTotal = ((quint64) liTotalBytes.QuadPart/1024/1024/1024);
  75. // QString liTotal_msg = tr("%1").arg(liTotal);
  76. // qDebug() << "liTotal_msg" <<liTotal_msg;
  77. // qDebug() << "liTotalFree" << ((quint64) liTotalFreeBytes.QuadPart/1024/1024/1024) ;
  78. // quint64 liFreeTotal = ((quint64) liTotalFreeBytes.QuadPart/1024/1024/1024);
  79. // QString liFreeTotal_msg = tr("%1").arg(liFreeTotal);
  80. // qDebug() << "liFreeTotal_msg" <<liTotal_msg;
  81. // diskmsg << liTotal_msg << liFreeTotal_msg;
  82. // qDebug() << diskmsg;
  83. QString use = QString::number( (double) (liTotalBytes.QuadPart - liTotalFreeBytes.QuadPart) / GB, 'f', 2 );
  84. use = use + "G";
  85. QString free = QString::number( (double) liTotalFreeBytes.QuadPart / GB, 'f', 2 );
  86. free = free + "G";
  87. QString all = QString::number( (double) liTotalBytes.QuadPart / GB, 'f', 2 );
  88. all = all + "G";
  89. int percent = 100 - ( (double) liTotalFreeBytes.QuadPart / liTotalBytes.QuadPart) * 100; /* 剩余百分比 */
  90. QString percent_str = QString::number( percent, 10 );
  91. // qDebug() << "--------------------------------------------";
  92. // myDebug( "use", use );
  93. // myDebug( "free", free );
  94. // myDebug( "all", all );
  95. // myDebug( "percent_str", percent_str );
  96. diskmsg << use << free << all << percent_str;
  97. myDebug( "diskmsg", diskmsg );
  98. return(diskmsg);
  99. }
  100. quint64 uDisk::getDiskFreeSpace(QString driver)
  101. {
  102. LPCWSTR lpcwstrDriver=(LPCWSTR)driver.utf16();
  103. ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;
  104. if( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) )
  105. {
  106. qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";
  107. return 0;
  108. }
  109. return (quint64) liTotalFreeBytes.QuadPart/1024/1024/1024;
  110. }

如何使用:

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

2、声明uDisk *m_uDisk = Q_NULLPTR;

3、调用:

  1. m_uDisk = new uDisk;
  2. qApp->installNativeEventFilter(m_uDisk);
  3. connect(m_uDisk, &uDisk::sigUDiskCome, [=](QString uDiskName)
  4. {
  5. ui->label->setText(tr("U Disk Come!").append(tr("The Disk is ") + uDiskName));
  6. });
  7. connect(m_uDisk, &uDisk::sigUDiskRemove, [=]()
  8. {
  9. ui->label->setText(tr("U Disk Remove!"));
  10. });

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

  1. if(m_uDisk)
  2. {
  3. delete m_uDisk;
  4. m_uDisk = Q_NULLPTR;
  5. }

例子

  1. {
  2. ui->setupUi(this);
  3. ui->progressBar->hide();
  4. ui->label_mem_info->hide();
  5. uDisk *m_uDisk = Q_NULLPTR;
  6. m_uDisk = new uDisk;
  7. qApp->installNativeEventFilter(m_uDisk);
  8. QString current_uDiskName;
  9. connect(m_uDisk, &uDisk::sigUDiskCome, [=](QString uDiskName)
  10. {
  11. ui->label_sd_info->setText(tr("U盘已插入!").append(tr(" 盘符为:") + uDiskName));
  12. QStringList DiskInfo = m_uDisk->getDiskInfo(QString(uDiskName + ":/"));
  13. myDebug("DiskInfo",DiskInfo);
  14. //显示内存信息
  15. ui->progressBar->show();
  16. ui->label_mem_info->show();
  17. //设置进度条的显示
  18. int progressBarValue = DiskInfo.last().toInt();
  19. ui->progressBar->setRange(0,100);
  20. ui->progressBar->setValue(progressBarValue);
  21. //显示存储状态信息
  22. QString use = DiskInfo.at(0); //use
  23. QString free = DiskInfo.at(1); //free
  24. QString total = DiskInfo.at(2); //total
  25. qDebug() << use << free << total;
  26. QString disk_info_show = free + "可用, " + "共" + total + ".";
  27. qDebug() << disk_info_show;
  28. ui->label_mem_info->setText(disk_info_show);
  29. });
  30. connect(m_uDisk, &uDisk::sigUDiskRemove, [=]()
  31. {
  32. ui->label_sd_info->setText(tr("U Disk Remove!"));
  33. ui->progressBar->hide();
  34. ui->label_mem_info->hide();
  35. });
  36. }

发表评论

表情:
评论列表 (有 0 条评论,140人围观)

还没有评论,来说两句吧...

相关阅读