第一章 文件处理
1.1 文件夹的拷贝
1.1.1 文件夹拷贝实现代码
bool DisplayDataBase::copyDirectoryFiles(const QString &fromDir, const QString &toDir, bool coverFileIfExist)
{
QDir sourceDir(fromDir);
QDir targetDir(toDir);
qDebug() << "copyDirectoryFiles:" << fromDir << toDir;
if(!targetDir.exists()){ /**< 如果目标目录不存在,则进行创建 */
if(!targetDir.mkdir(targetDir.absolutePath())) {
return false;
}
}
QFileInfoList fileInfoList = sourceDir.entryInfoList();
foreach(QFileInfo fileInfo, fileInfoList){
if(fileInfo.fileName() == "." || fileInfo.fileName() == "..") {
continue;
}
if(fileInfo.isDir()){ /**< 当为目录时,递归的进行copy */
if(!copyDirectoryFiles(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()), coverFileIfExist)) {
return false;
}
} else{ /**< 当允许覆盖操作时,将旧文件进行删除操作 */
if(coverFileIfExist && targetDir.exists(fileInfo.fileName())){
targetDir.remove(fileInfo.fileName());
}
/// 进行文件copy
if(!QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()))){
return false;
}
}
}
return true;
}
1.2 文件夹的删除
第二章 界面布局
2.1 基本控件
2.1.1 QPushButton控件
//笔记生成按钮
generateNote = new QPushButton(this);//新建一个按钮
generateNote->setText(tr("generate note"));//设置按钮上方显示的名字
generateNote->setFixedWidth(100);//设置按钮的固定长度
第三章 检测usb相关
3.1 检测PC机usb插拔情况
先上代码再说吧!!!
3.1.1 相关实现代码:
- 这部分的代码实现需要注意,必须放在一个独立的窗口之中,此时才能获到该事件。这一点在调试中确实浪费了我比较长的时间,望各位读者引以为鉴。
- 另一点需要注意的是#include <Windows.h>头文件的包含,一不小心就会报出“expected ',' or '...' before 'struct'”的错误。
下列是具体函数的实现:
char DeviceWindow::FirstDriveFromMask(ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
bool DeviceWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
int msgType = msg->message; if(msgType==WM_DEVICECHANGE)
{
qDebug() << "Event DEVICECHANGE Happend" << endl;
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)
{
//插入u盘
QString USBDisk = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask));
qDebug() << "USB_Arrived and The USBDisk is: "<<USBDisk ;
//ui->textBrowser->append("USB_Arrived and The USBDisk is " + USBDisk);
}
}
if(lpdb->dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE)
{
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
QString strname = QString::fromWCharArray(pDevInf->dbcc_name,pDevInf->dbcc_size);
// ui->textBrowser->append("插入设备 :" + strname);
} break;
case DBT_DEVICEREMOVECOMPLETE:
qDebug() << "设备移除" <<endl;
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if(lpdbv->dbcv_flags == 0)
{ //qDebug() << "USB_Removed"; ui->textBrowser->append("USB_Remove");
;}
}
if(lpdb->dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE)
{
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
qDebug()<< "移除设备(name):" << pDevInf->dbcc_name;
//qDebug()<< "移除设备(guid):" << pDevInf->dbcc_classguid; qDebug()<< "移除设备(size):" << pDevInf->dbcc_size;
QString strname = QString::fromWCharArray(pDevInf->dbcc_name,pDevInf->dbcc_size);
//ui->textBrowser->append("移除设备 " + strname);
} break;
}
}
return false;
}
下列是头文件的实现(一些重要头文件的包含):
#include <Windows.h>
#include <QMainWindow>
#include<InitGuid.h>
#include<devguid.h>
#include<dbt.h>
#include <QDebug>
private:
Ui::DeviceWindow *ui;
char FirstDriveFromMask (ULONG unitmask);
protected:
bool nativeEvent(const QByteArray & eventType, void * message, long*result);
3.2 深入了解WM_DEVICECHANGE消息
首先,当PC机有USB插口插入时,windows会向窗口发送WM_DEVICECHANGE消息。
当系统发送WM_DEVICECHANGE消息时,会附带俩个参数,一个wParam,一个lParam,lParam指向PDEV_BROADCAST_HDR。wParam表示设备发生了何种变化。
wParam的值为DBT_DEVICEARRIVAL时,表示设备已经插入并且可用。DBT_DEVICEREMOVECOMPLETE表示设备已经成功移出。
struct _DEV_BROADCAST_HDR {
DWORD dbch_size;
DWORD dbch_devicetype;
DWORD dbch_reserved;
};
dbch_devicetype 取值为:
#define DBT_DEVTYP_OEM 0x00000000//OEM或IHV厂商自定义设定的设备类
#define DBT_DEVTYP_DEVNODE 0x00000001
#define DBT_DEVTYP_VOLUME 0x00000002//逻辑磁盘分卷
#define DBT_DEVTYP_PORT 0x00000003//端EI设备(串行或并行)
#define DBT_DEVTYP_NET 0x00000004
#define DBT_DEVTYP_DEVICEINTERFACE 0x00000005//表明为某类设备接口
#define DBT_DEVTYP_HANDLE 0x00000//文件句柄
3.2.1 DEV_BROADCAST_DEVICEINTERFACE_W
这个结构中这五个属性在我看来,并没有什么卵用 ,因为除了dbcc_size的值之外,剩下的值不同设备都是相同的。
typedef struct _DEV_BROADCAST_DEVICEINTERFACE_W {
DWORD dbcc_size;
DWORD dbcc_devicetype;
DWORD dbcc_reserved;
GUID dbcc_classguid;
wchar_t dbcc_name[1];
} DEV_BROADCAST_DEVICEINTERFACE_W,*PDEV_BROADCAST_DEVICEINTERFACE_W;
3.2.2 _DEV_BROADCAST_VOLUME
struct _DEV_BROADCAST_VOLUME {
DWORD dbcv_size;
DWORD dbcv_devicetype;
DWORD dbcv_reserved;
DWORD dbcv_unitmask;
WORD dbcv_flags;
};
第四章 Qt项目的发布(window环境)
4.1.首先采用Release版本进行编译。
4.2.打开Qt 5.7 for Desktop(试自己安装的qt版本而定)
4.2.1 进入第一步编译生成exe文件所在文件夹
4.2.2 使用windeployqt ***.exe 来进行对应依赖库的生成。
五:一级标题
六:一级标题
七:一级标题
八:一级标题