目录
1、QT环境 5.14.0 编译环境mingw530-5.14.0
2、按键修改名字前已经生成槽函数,修改名字后会报错,解决办法
QT5实战项目_哔哩哔哩_bilibili
第一节 开发环境、基础知识
1、QT环境 5.14.0 编译环境mingw530-5.14.0
Qt 安装过程中默认是有自己的套件, 我们可以依据自己实际选择对应套件, 每一个套件都有自己对应的Qt Versions(qmake设置),编译器g++设置,debug(gdb路径设置),。 由于要把程序烧录移植到指定机器,该机器运行Qt需要特定对应的编译构建套件, 所以不能用Qt安装的默认的构建套件,需要自己重新构建新的套件。
2、创建工程
3、设置无边框
跳转查看值
设置边框值
4、移动窗体
查找函数
斜体表示虚函数,还未定义
定义
快捷键方式 ALT+回车,选择在widget即可
继承 QWidget::mouseMoveEvent(event);
x,y,z的关系,x为窗口与桌面的关系,y为鼠标与桌面的关系,z为鼠标与窗口的关系
定义z成员变量,需要加一下头文件
QPoint 是二维坐标(x,y)
QT::?? 表示引用QT里面的局部变量
第二节 基础知识
1、预览快捷键
Alt+Shift+R
2、expanding 有弹簧效果
2、更改按键样式
QPushButton{}//初始状态时
QPushButton:pressed{}//鼠标按下状态
QPushButton:hover{}//鼠标悬浮状态
"background-color:rgba(100,225,100,30); 背景色,rgba分别为红绿蓝色以及透明度
“border-radius:10px;” 边框圆角半径
“border: 4px outset rgb(255,255,255);” 边框宽度、样式和颜色,边框样式可分(inset/outset),分别为内边框和外边框
“font:bold 10px;” 字体,字体大小
“color:rgb(0,0,0);” 字体颜色
QPushButton {
border:none;
//none : 无边框。与任何指定的border-width值无关
//hidden : 隐藏边框。IE不支持
//dotted : 在MAC平台上IE4+与WINDOWS和UNIX平台上IE5.5+为点线。否则为实线(常用)
//dashed : 在MAC平台上IE4+与WINDOWS和UNIX平台上IE5.5+为虚线。否则为实线(常用)
//solid : 实线边框(常用)
//double : 双线边框。两条单线与其间隔的和等于指定的border-width值
//groove : 根据border-color的值画3D凹槽
//ridge : 根据border-color的值画菱形边框
//inset : 根据border-color的值画3D凹边
//outset : 根据border-color的值画3D凸边
"background-color:rgba(100,225,100,30); 背景色,rgba分别为红绿蓝色以及透明度
“border-radius:10px;” 边框圆角半径
“border: 4px outset rgb(255,255,255);” 边框宽度、样式和颜色,边框样式可分(inset/outset),分别为内边框和外边框
“font:bold 10px;” 字体,字体大小
“color:rgb(0,0,0);” 字体颜色
}
QPushButton:hover //鼠标指到
{
background-color: rgb(255, 85, 255);
}
QPushButton:pressed //鼠标按压下去
{
background-color: rgb(170, 255, 0);
}
参考例程
3、设置按钮功能
右键按钮-->转到槽
void Widget::on_close_clicked()
{
this->close(); //关闭
}
void Widget::on_max_clicked()
{
if(this->isMaximized()) //判断是否是最大化
this->showNormal(); //变回正常
else
this->showMaximized();
}
void Widget::on_min_clicked()
{
this->showMinimized(); //最小化
}
修改完ui后按锤子,就可以进行修改了
4、编译动态库
生成后
修改信息
编写完成后,右键工程,构建
在build??-->debug中找到导出的库和函数
5、动态库使用方法
1、拷贝到项目的目录中
2、在项目工程文件中加一行
LIBS + = -L . -llib
// += 表示加入
// -L 表示路径 存放的路径
// .
// -l 库的名字 l(引入符号)+lib(库命)
// a 为动态库 dll为静态库
3、引入头文件
4、引用对应的类,函数
6、影子构建的作用
就是说采用这种模式构建时,将在一个与你的项目的源代码目录不同的目录下进行,而你的工程源目录将是“干净”的,不会有任何的改动。
当你的工程设置需要频繁变更时,使用影子模式以适应各种情况是最佳的选择。
第三节 重复文件检测工具
1、打开文件的函数
将读到的文件显示出来
如果产生了乱码
2、按键修改名字前已经生成槽函数,修改名字后会报错,解决办法
1、将头文件下的未修改名字的变量删掉
2、接着再将报错的地方 将对应的 case选项去掉即可
3、计算MD5
1、原理 每个文件都可以计算出一个md5,当文件修改时,md5就会修改,通过md5可以判断文件是否相同
2、在窗口 加入头文件
#include <QCryptographicHash>
3、
4、防止文件卡死
1、加入头文件
#include <QCoreApplication>
2、
qApp->processEvents(); //基于事件循环,所以弄一个就可以达到效果,不过还是很卡顿
5、遍历目录
1、在头文件中定义函数
QStringList getFiles(const QString &path);
//原理该函数可以存很多的字符串 字符串类型的列表
2、编写实现函数
//在窗口文件上加入头文件
#include <QDir>
#include <QFileInfo>
QStringList Widget::getFiles(const QString &path)
{
QStringList ret;
QDir dir(path);
//.表示当前目录,..表示上一级目录
QFileInfoList infolist = dir.entryInfoList(QDir::Files|QDir::Dirs|QDir::NoDotAndDotDot);
for (int i = 0;i<infolist.count();++i)
{
QFileInfo info =infolist.at(i);
if(info.isDir())
{
QString subDir =info.absoluteFilePath();
//如果是目录,就启用getfile,传入目录,参数。
QStringList files =getFiles(subDir); //递归,重复调用该函数
ret.append(files);
}
else
{
QString fileName =info.absoluteFilePath();
ret.append(fileName);
}
}
return ret;
}
6、文件数量记录
1、加入头文件
#include <QMap> //排序的
#include <QHash> //没有排序的
//md5 (file,file)
QHash<QByteArray,QStringList> fileMd5; //定义用于存储的变量
2、
void Widget::on_pushButton_clicked()
{
QStringList files = getFiles("D:\\learning file\\QT\\3");
for (int i =0;i<files.count();++i)
{
QString fileName = files.at(i);
QByteArray md5 =getFileMd5(fileName);
qDebug() << "fileName" << fileName << " md5:" << md5.toHex();
fileMd5[md5].append(fileName);
}
for(QHash<QByteArray,QStringList>::iterator itr=fileMd5.begin(); itr != fileMd5.end();++itr) //循环
{
qDebug() <<"md5:" << itr.key().toHex() << "count:" << itr.value().count();
if(itr.value().count() > 1)
{
qDebug() << "file:" << itr.value();
}
}
}
第四节 文件对比工具
1、创建新类
1、右键项目-->Add NewClass
2、 上下页快捷键
alt+左、右
3、构建信号与槽
//放到类代码构造函数中
connect(&md5,SIGNAL(gotDumplate(QHash<QByteArray,QStringList>)),
this,SLOT(on_GotDumplate(QHash<QByteArray,QStringList>)));
//第一个为信号发出者,第二个为信号,接收者,槽函数
要到对应的地方产生信号
emit gotDumplate(ret); //产生信号
4、创建线程
1、
//加入头文件
#include <QThread>
2、创建成员变量
//放到类的私有中
QThread thread;
3、将实例类放到线程中
// //放到类代码构造函数中
//启动
thread.star();
//将类放到线程中
md5.moveToThread(&thread);
4、构建关系
//构建信号与槽关系串联起
5、关闭线程
//放到窗口类的析构函数中
thread.exit();
thread.wait();
5、设置进度条
1、创建进度条
display-->progress bar
//在功能类头文件中创建信号
void progress(int current,int total); //进度条信号,当前值,总共值 用于进度条显示
//在窗口类头文件中创建信号
void on_Progress(int current,int total); //进度条槽
//在窗口类中创建关系
connect(&md5,SIGNAL(progress(int,int)),this,SLOT(on_Progress(int,int))); //进度条
2、设置信号发送
//在功能类中具体位置放置 信号发送
emit progress(i+1,files.count());
//发送进度条信号,当前值,总共值 i+1的原因是,i由1开始,i最大值比总数小1
3、编写进度条槽函数
//窗口类中创建对应的槽函数
void Widget::on_Progress(int current, int total)
{
ui->progressBar->setMaximum(total); //最大值
ui->progressBar->setValue(current); //当前值
}
4、重置进度条
//放到按键启动函数下,每次按下按键,进度条会重现设置0
ui->progressBar->setValue(0); //重新按的时候,进度条为0
6、设置打开目录
1、加入头文件
#include <QFileDialog>
2、添加 line edit
3、编写弹出框
//在窗口类具体地方添加
QString path = QFileDialog::getExistingDirectory(this,"select a folder",".");
//文件选择对话框 第一个参数是在哪个类,第二个参数弹出框的标题,第三个参数当前目录
ui->lineEdit->setText(path); //将路径显示在栏框中
7、hash容器查找
注:key一定要转换成对应的类型,否则查找不出
//QHash<QByteArray, QStringList> dumplates;
//dumplates 是一种QHash容器 通过key进行寻找时,
//需要清楚当时存进去的是什么格式的,
//有时候虽然数据是一样的,但由于格式不一样,是无法进行搜索的
QStringList files = this->dumplates[currentText.toLocal8Bit()];
//currentText 当前钥匙key
//转换成字符串格式
8、软件打包
1、生成Release版本
2、找到生成文件的目录
//此处是我的目录,可以按照我的目录在你的工程路径下寻找
D:\learning\QT\QT\4\build-chongfuwenjianjiance-Desktop_Qt_5_14_2_MinGW_64_bit-Release\release
3、启动Qt 5.14.2 (MinGW 7.3.0 64-bit)窗口
4、转换目录
cd /d D:\learning\QT\QT\4\build-chongfuwenjianjiance-Desktop_Qt_5_14_2_MinGW_64_bit-Release\release
//按照上面查找的release目录进行输入 注意:复制我的没有任何用
格式: cd /盘符 生成release文件目录
5、运行windeployqt
windeployqt chongfuwenjianjiance.exe
//格式为:windeployqt 你的项目名字.exe
等运行完之后,你就可以进行发布了
注:你前面选择的是32版本的release就要用32的窗口,是64的release就要用64的窗口,否则百分百报错,一定注意