QT实战学习记录一

这篇博客介绍了如何在QT5环境下开发无边框窗体,包括设置窗体移动、预览快捷键、自定义按键样式及功能,并详细讲解了动态库的编译和使用。此外,还展示了如何创建重复文件检测工具,包括遍历目录、计算MD5和防止文件卡死。最后,提到了文件对比工具的实现,包括线程、进度条和文件夹选择功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

第一节 开发环境、基础知识

1、QT环境    5.14.0    编译环境mingw530-5.14.0

2、创建工程​

3、设置无边框

4、移动窗体

第二节  

1、预览快捷键   

2、更改按键样式

3、设置按钮功能

4、编译动态库

5、动态库使用方法

6、影子构建的作用

第三节   重复文件检测工具

1、打开文件的函数

​2、按键修改名字前已经生成槽函数,修改名字后会报错,解决办法

3、计算MD5

4、防止文件卡死

5、遍历目录

​6、文件数量记录

第四节  文件对比工具

1、创建新类

2、 上下页快捷键

3、构建信号与槽

4、创建线程

5、设置进度条

6、设置打开目录

7、hash容器查找

8、软件打包


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的窗口,否则百分百报错,一定注意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值