ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

通俗易懂玩Qt:文件校验码生成器的实现(内附源码)

2021-10-24 13:03:09  阅读:229  来源: 互联网

标签:Qt void 生成器 DealProcess 源码 ui QString data MainWindow


Qt 实现文件校验码生成器(内附源码)

该软件是基于 CertUtil 的一个文件文件校验码生成,旨在提高下载程序的一个安全系数,防止黑客攻击网站后,将携带病毒的程序放在下载链接上,当用户使用程序时,被移植的病毒破坏系统,盗取可用信息,留下后门。

一、实验效果与开发环境

效果图如下:

请添加图片描述

开发环境:
在这里插入图片描述

二、实验源代码

dealProcess.h

class DealProcess : public QObject {
    Q_OBJECT

public:
    explicit DealProcess(QObject *parent = nullptr);
    ~DealProcess();

    void write(QString data);
    QByteArray exec(QString command, QStringList args);

private:
    QProcess *process;
    QByteArray data_in;

    void init();
};

dealProcess.c

DealProcess::DealProcess(QObject *parent) :
    QObject(parent) {

    init();
}

DealProcess::~DealProcess() {}

void DealProcess::init() {
    process = new QProcess;
    data_in.resize(0);  //将数据初始化为 0
}

QByteArray DealProcess::exec(QString command, QStringList args) {
    QByteArray res = "Process had been executed!"; //定义一个

    process -> start(command, args);    //开启一条命令执行通道

    if(!process -> waitForStarted()) {  //等待命令通道的开启
        return "Process start failed!"; //否则返回命令通道失败
    }

    if(data_in.size() != 0) {           //判断写入数据的长度是否为 0,是则跳过写入步骤
        process -> write(data_in);      //写入数据
        process -> closeWriteChannel(); //关闭数据写入通道
    }

    if(!process -> waitForFinished()) { //等待命令自行完成
        return "Process finished failed!";  //否则返回命令执行失败
    }

    data_in.resize(0);  //将数据还原为 0

    res = process -> readAll();    //接收反馈数据

    return res; //返回反馈数据
}

void DealProcess::write(QString data) {
    QByteArray byteArray;   //初始化一个 QByteArray 变量用来接收需要写入的数据

    byteArray = data.toUtf8().data();   //使用变量 byteArray 接收写入数据
    data_in.resize(byteArray.size());   //根据接收数据大小重新定义类成员变量 data_in 的大小
    data_in = byteArray;    //将变量 byteArray 接收到的数据写入到类成员变量
}

mainWindow.h

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    DealProcess *deal_process;

    QFileDialog *file_dialog;

    QMessageBox *message_box;

    QClipboard *clipboard;

    QString command;
    QStringList args;

    QPalette pale;
    QColor color,
           drop_color;

    void configInit();
    void uiInit();
    void connectInit();
    void setBackgroung(QColor color);
    void setUrl(QString url);

protected:
    void dragEnterEvent(QDragEnterEvent *e);
    void dragLeaveEvent(QDragLeaveEvent *e);
    void dropEvent(QDropEvent *e);
};

mainWindow.c

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow) {
    ui -> setupUi(this);

    configInit();
    uiInit();
    connectInit();
}

MainWindow::~MainWindow() {
    delete ui;
}

void MainWindow::setBackgroung(QColor color) {
    pale = palette();
    pale.setColor(QPalette::Window, color);
    setPalette(pale);
}

void MainWindow::setUrl(QString url) {
    ui -> labFileUrl -> setText(url);
    ui -> labFileUrl -> setToolTip(tr(url.toLocal8Bit().data()));
    args[1] = url;
}

void MainWindow::configInit() {
    deal_process = new DealProcess; //初始化命令处理类
    command = "CertUtil";
    args << "-hashfile" << "" << "md5";
    file_dialog = new QFileDialog;
    color.setRgb(243, 243, 243, 255);       //窗口背景色
    drop_color.setRgb(230, 230, 230, 250);  //拖拽进入后的窗口背景色
    clipboard = QApplication::clipboard();

    setWindowTitle("文件校验码生成器");
    setAcceptDrops(true);   //允许放下操作
    setBackgroung(color);
}

void MainWindow::uiInit() {
    //QGroupBox init.
    ui -> grbChooseFile -> setTitle("选择校验文件");
    ui -> grbResult -> setTitle("运行结果");
    ui -> grbValue -> setTitle("校验值");

    //QPushButton init.
    ui -> btnChooseFile -> setText("选择文件");
    ui -> btnCreateFileChecker -> setText("获取校验");
    ui -> btnCopyCode -> setText("复制代码");

    //QComboBox init
    QStringList str_list_check_type;
    str_list_check_type << "MD2" << "MD4" << "MD5" << "SHA1" << "SHA256" << "SHA384" << "SHA512";
    for(int i = 0; i < str_list_check_type.length(); i ++) {
        ui -> cbbCheckType -> addItem(str_list_check_type[i], str_list_check_type[i]);
    }
    ui -> cbbCheckType -> setCurrentText("MD5");

    //QPlainTextEdit
    ui -> ptedResult -> setDisabled(true);

    //QMessageBox
    message_box = new QMessageBox;
    message_box -> setButtonText(QMessageBox::Close, QString("关闭"));

    //QLabel
    ui -> labFileUrl -> setText("");

    //QStatusBar
    ui -> statusBar ->addPermanentWidget(new QLabel("<font>&#169;</font>2021-2099 我是混子我怕谁"));

    //QMenu
    ui -> actionQuit -> setShortcut(Qt::CTRL | Qt::Key_Q);

    ui -> actionCompare -> setShortcut(Qt::ALT | Qt::Key_C);
}

void MainWindow::connectInit() {
    //QPushButton
    connect(ui -> btnChooseFile, &QPushButton::clicked, [=] {
        QString url;
        url = file_dialog -> getOpenFileName(this,
                                             tr("选择文件"),
                                             QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),
                                             tr("所有文件(*.*);;压缩文件(*.zip *.rar *.7z);;"));
        setUrl(url);
    });

    connect(ui -> btnCreateFileChecker, &QPushButton::clicked, [=] {
        QString res = "";

        if(args[1] != "") {
            res = QString::fromLocal8Bit(deal_process -> exec(command, args));
            ui -> ptedResult -> clear();
            ui -> ptedResult -> appendPlainText(res);
            ui -> ledCheckerCode -> setText(res.split("\r\n")[1].split(' ').join(""));
        }
        else {
            message_box -> critical(this, "温馨提示", "请选择即将校验的文件!", QMessageBox::Close);
        }
    });

    connect(ui -> btnCopyCode, &QPushButton::clicked, [=] {
        QString checker_code = ui -> ledCheckerCode -> text();  //获取校验码

        if(checker_code != "") {    // 判断校验码是否为空
            clipboard -> setText(checker_code);
        }
    });

    //QComboBox
    connect(ui -> cbbCheckType, &QComboBox::currentTextChanged, [=](QString check_type) {
        args[2] = check_type;
    });

    //QMenu
    connect(ui -> actionQuit, &QAction::triggered, [=] {
        QMainWindow::close();
    });

    connect(ui ->actionCompare, &QAction::triggered, [=] {
        qDebug() << 1;
    });
}

void MainWindow::dragEnterEvent(QDragEnterEvent *e) {
    e -> acceptProposedAction();    //接收放下操作

    setBackgroung(drop_color);
}

void MainWindow::dragLeaveEvent(QDragLeaveEvent *e) {
    Q_UNUSED(e);

    setBackgroung(color);
}

void MainWindow::dropEvent(QDropEvent *e) {
    setBackgroung(color);

    QList<QUrl> urls = e -> mimeData() -> urls();

    if(urls.length() != 1) {
        message_box -> critical(this, "友情提示", "不接受多个文件,请拖拽单个\r\n文件!", QMessageBox::Close);
        return;
    }

    QString url = urls[0].path().mid(1);

    if(QFileInfo(url).isDir()) {
        message_box -> critical(this, "友情提示", "不接受文件夹,请拖拽单个\r\n文件!", QMessageBox::Close);
        return;
    }

    setUrl(url);
}

源码分享:https://gitee.com/mjzhutianxiu/filechecker

后续还会在原有的基础上做微调,详细源码。

学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!

标签:Qt,void,生成器,DealProcess,源码,ui,QString,data,MainWindow
来源: https://blog.csdn.net/qq_36553707/article/details/120932006

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有