首页 > 其他分享 >Qt 项目实战:MD5工具开发

Qt 项目实战:MD5工具开发

时间:2024-02-19 13:57:56浏览次数:32  
标签:实战 Widget Qt void Md5Check ui include MD5

MD介绍

  MD5消息摘要算法(英语:MD5 Message­Digest Algorithm),一种被广泛使用 的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于 确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。

MD5应用编辑

  • 一致性验证
  • 数字签名
  • 安全访问认证

需求描述:

使用 notepad++ ­>工具­> MD5时,对大文件解析界面直接卡死

解决办法:处理线程和界面线程分离

界面线程直接调用肯定是不行的,因为主线程调用的工作还是在界面线程里头,还是会卡界面。需要分离线程,通过信号与槽发出去,在线程中跑起来

类 Widget
Widget.h

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3 
 4 #include <QWidget>
 5 #include <QFile>
 6 #include <QFileInfo>
 7 #include <QFileDialog>
 8 #include <QDebug>
 9 #include <QCryptographicHash>
10 #include <QThread>
11 
12 #include "md5Check.h"
13 
14 QT_BEGIN_NAMESPACE
15 namespace Ui { class Widget; }
16 QT_END_NAMESPACE
17 
18 class Widget : public QWidget
19 {
20     Q_OBJECT
21     
22 public:
23     Widget(QWidget *parent = nullptr);
24     ~Widget();
25 signals:
26     void checkMd5SumSignal(QString filePath);
27     
28 private slots:
29     void recvMd5CheckSunSlot(const QByteArray &);
30     
31     void recvProgressBarSlot(int, int);
32     
33     void on_pushButton_clicked();
34     
35     void on_toolButton_2_triggered(QAction *arg1);
36     
37     void on_toolButton_2_clicked();
38     
39 private:
40     Ui::Widget *ui;
41     Md5Check mMd5CheckSum;
42     QThread Md5Thread;
43 };
44 #endif // WIDGET_H

Widget.cpp

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 
 4 Widget::Widget(QWidget *parent)
 5     : QWidget(parent)
 6     , ui(new Ui::Widget)
 7 {
 8     ui->setupUi(this);
 9     Md5Thread.start();
10     mMd5CheckSum.moveToThread(&Md5Thread);
11 
12     qDebug()<< "Widget::Widget" << QThread::currentThreadId();
13     /* 启动转换 */
14     connect(&mMd5CheckSum, SIGNAL(sendMd5CheckSunSignal(QByteArray)),
15             this, SLOT(recvMd5CheckSunSlot(QByteArray)), Qt::QueuedConnection);
16 
17     /* 反馈进度 */
18     connect(&mMd5CheckSum, SIGNAL(sendProgressBarSignal(int,int)),
19             this, SLOT(recvProgressBarSlot(int,int)));
20 
21     /* 结果反馈 */
22     connect(this, SIGNAL(checkMd5SumSignal(QString)),
23             &mMd5CheckSum, SLOT(getMd5CheckSumSlot(QString)));
24 
25 }
26 
27 Widget::~Widget()
28 {
29     Md5Thread.terminate();
30     Md5Thread.wait(10000);
31 
32     //    Md5Thread.exit();  //线程退出
33     //    Md5Thread.wait(10 * 1000); //10秒超时
34     //10秒以内,如果线程退出了,退出阻塞
35     delete ui;
36 }
37 
38 
39 void Widget::on_pushButton_clicked()
40 {
41     this->close();
42 }
43 
44 
45 void Widget::on_toolButton_2_triggered(QAction *arg1)
46 {
47 
48 }
49 
50 void Widget::recvMd5CheckSunSlot(const QByteArray & md5)
51 {
52     ui->textBrowser->setText(md5);
53 }
54 
55 void Widget::recvProgressBarSlot(int current, int max)
56 {
57     ui->progressBar->setMaximum(max);
58     ui->progressBar->setValue(current);
59 }
60 
61 
62 void Widget::on_toolButton_2_clicked()
63 {
64     QString md5FileName = QFileDialog::getOpenFileName(this,
65                                                        QString::fromLocal8Bit("选择需要MD5的文件"));
66     if(!md5FileName.isEmpty())
67     {
68         //        mMd5CheckSum.getMd5CheckSumSlot(md5FileName);  //直接调用 一定是在同一个线程
69         emit checkMd5SumSignal(md5FileName);
70         ui->lineEdit->setText(md5FileName);
71     }
72 }

类 Md5Check

Md5Check.h

 1 #ifndef MD5CHECK_H
 2 #define MD5CHECK_H
 3 
 4 /*
 5     计算md5值:
 6     反馈md5值
 7     反馈进度:
 8 */
 9 #include <QObject>
10 #include <QFile>
11 #include <QFileInfo>
12 #include <QFileDialog>
13 #include <QDebug>
14 #include <QCryptographicHash>
15 #include <QThread>
16 
17 
18 class Md5Check : public QObject
19 {
20     Q_OBJECT
21 public:
22     explicit Md5Check(QObject *parent = nullptr);
23 
24 signals:
25     void sendMd5CheckSunSignal(const QByteArray &); //反馈md5值到界面
26     void sendProgressBarSignal(int, int);           //反馈进度到界面 以生存进度条
27 
28 public slots:
29     void getMd5CheckSumSlot(const QString &filePath);
30 };
31 
32 #endif // MD5CHECK_H

Md5Check.cpp

 1 #include "md5Check.h"
 2 
 3 Md5Check::Md5Check(QObject *parent) : QObject(parent)
 4 {
 5     
 6 }
 7 
 8 void Md5Check::getMd5CheckSumSlot(const QString &checkFile)
 9 {
10     QFileInfo md5FileInfo;
11     QString md5FileName = checkFile;
12     qDebug() << md5FileName;
13     QByteArray md5;
14     
15     md5FileInfo = QFileInfo(md5FileName);
16     
17     int fileSize =  md5FileInfo.size();  //文件总大小
18     int haveReadSize = 0;                    //已经处理过了的文件的大小
19     int totalFileSize =  int(md5FileInfo.size() / (1024 * 1024));
20     qDebug() << "totalFileSize" << totalFileSize <<QThread::currentThreadId();
21     
22     
23     if(md5FileInfo.exists())
24     {
25         QFile file(md5FileName);
26         if (!file.open(QIODevice::ReadOnly))
27         {
28             qDebug() << file.errorString();
29         }
30         else
31         {
32             qDebug() << "open sucess !";
33             
34             QCryptographicHash hash(QCryptographicHash::Md5);
35             
36             while(!file.atEnd())
37             {
38                 QByteArray content = file.read(1024*1024); //1M  最后不足1M,把最后的读完
39                 hash.addData(content);
40                 haveReadSize++;
41                 //qDebug() << "haveReadSize" << haveReadSize;
42                 
43                 emit sendProgressBarSignal(haveReadSize, totalFileSize); //尺寸很有可能大于int32
44             }
45             
46             //emit sendProgressBarSignal(fileSize, fileSize);  //作弊
47             
48             md5  = hash.result().toHex();
49             emit sendMd5CheckSunSignal(md5);
50             qDebug() << md5;
51         }
52     }
53 }

 

标签:实战,Widget,Qt,void,Md5Check,ui,include,MD5
From: https://www.cnblogs.com/ybqjymy/p/18020925

相关文章

  • Qt 项目实战:幸运转盘
    幸运电子转盘基础绘图通过paintEvent来绘图鼠标事件:鼠标左键单击开始旋转Timer:定时器信号与槽1#ifndefWIDGET_H2#defineWIDGET_H34#include<QWidget>5#include<QEvent>6#include<QDebug>7#include<QTimer>8#include<QTime>9#include&l......
  • Qt 使用Http协议通信
    介绍使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,网络通信常用的一种协议就是http协议。QT对http协议进行了封装,下面将介绍两种http通信方式的使用。在使用http时需要在pro文件中添加对应的模块。QT+=networkhttp主要两种通信方式为get和post......
  • electron delphi winform wpf qt的对比
    Electron、Delphi、WinForms、WPF和Qt都是用于开发桌面应用程序的工具或框架,它们各自有一些独特的优点和适用场景。以下是对这些工具的简要对比:Electron:基于Web技术(HTML、CSS和JavaScript)的跨平台桌面应用程序开发框架。使用Chromium渲染引擎提供强大的页面渲染能力。适用......
  • OpenResty 介绍与实战讲解(nginx&lua)
    目录一、概述二、OpenResty安装三、OpenResty的工作原理四、OpenResty核心模块1)ngx_lua模块2)ngx_stream_lua模块3)ngx_http_lua_module模块4)ngx_http_headers_more模块5)ngx_http_echo模块6)ngx_http_lua_upstream模块7)ngx_http_redis模块8)ngx_http_proxy_connect_module......
  • 如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口
    在Qt框架中,要实现一个无标题栏、半透明、置顶(悬浮)的窗口,需要一些特定的设置和技巧。废话不多说,下面我将以DrawClient软件为例,介绍一下实现这种效果的四个要点。要点一:移除标题栏(去除关闭、最小化、最大化按钮)在窗口的构造函数中设置窗口的样式,在强调一下,一定要找构造函数中设置,......
  • FluentFTP实战:轻松操控FTP文件,创造高效传输体验
     概述:通过FluentFTP库,轻松在.NET中实现FTP功能。支持判断、创建、删除文件夹,判断文件是否存在,实现上传、下载和删除文件。简便而强大的FTP操作,提升文件传输效率。在.NET中,使用FluentFTP库可以方便地实现FTP的相关功能。以下是判断文件夹是否存在、文件夹的创建和删除、判断文......
  • Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按
    需求  使用QCustomPlot绘制多个目标的北斗运行轨迹图,包括累计绝对位置图和记录时刻的相对位置图。  当前绘制存在问题:    交付客户前,公司内部自测流程发现的问题。  实际预期效果为:   原因  QCustomPlot加入数据是按照x轴排列,也可以按照y轴排列,使用图层......
  • QT_linux
    加载本地图片/*QPixmap类型对象*/QPixmapimage;/*加载*/image.load(":/image/cd.png");//不缩放ui->label->setScaledContents(false);//图片在标签中居中显示(水平和垂直方向均居中)ui->label->setAlignment(Qt::AlignCenter);pixbad2(":/1/bad.png");......
  • QT打包
    Qt打包程序提示“应用程序无法正常启动(0xc000007b)”/未找到Qt5Core.dll的正确解决方案先打到配置环境变量的页面 ......
  • Qt环境Windows应用程序动态变更系统默认打印机
    有些工作环境安装有多个打印机,针对不同需求进行各种输出。如果是用QPrinter进行打印控制,可以通过setPrinterName确定使用哪一个打印机,但如果程序使用了第三方功能进行打印输出,比如通过QAxObject调用系统的文字处理直接输出,就可能会遇到无法明确指定哪一个打印机的问题。这时就需要......