Qt编程手册(持续更新中)

 

第一章   文件处理

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  相关实现代码:

  1. 这部分的代码实现需要注意,必须放在一个独立的窗口之中,此时才能获到该事件。这一点在调试中确实浪费了我比较长的时间,望各位读者引以为鉴。
  2. 另一点需要注意的是#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 来进行对应依赖库的生成。

过程如图所示

五:一级标题

六:一级标题

七:一级标题

八:一级标题

 

 

 

 

 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程详细、全面地介绍了 Qt 开发的各个技术细节,并且额外赠送在嵌入式端编写Qt程序的技巧。整个课程涵盖知识点非常多,知识模块囊括 Qt-Core 组件、QWidgets、多媒体、网络、绘图、数据库,超过200个 C++ 类的分析和使用,学完之后将拥有 Qt 图形界面开发的非常坚实的功底。 每个知识点不仅仅会通过视频讲解清楚,并且会配以精心安排的实验和作业,用来保证学习过程切实掌握核心技术和概念,通过实验来巩固,通过实验来检验,实验与作业的目的是发现问题,发现技术盲点,通过答疑和沟通夯实技术技能。注意:本套视频教程来源于线下的实体班级,因此视频有少量场景对话和学生问答,对此比较介意的亲们谨慎购买。注意:本套视频教程包含大量课堂源码,包含对应每个知识点的精心编排的作业。由于CSDN官方规定在课程介绍不能出现作者的联系方式,因此在这里无法直接给出QQ答疑号,视频的源码、资料和作业文档链接统一在购买后从CSDN平台跟我沟通,我会及时回复跟进。注意:本套视频教程包含全套10套作业题,覆盖所有视频知识点,循序渐进,各个击破,作业总纲如下:下面是部分作业题目展示,每道题都有知识点说明,是检验学习效果的一大利器:(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)…… ……

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值