今回は、Qt5を使ってファイルのハッシュ値を求めるアプリを作りました。
Qt5でファイルのハッシュ値を求める方法や、ダイアログからファイルを選択する方法をまとめました。
今回作成したアプリケーションは、アプリと言えるほどんものではないですが、アプリ開発の導入として一度作ってみるのもいいかもしれません。
記事の最後に、ソースコードを全て載せておくので、参考にしてください。
アプリケーションの概要
アプリケーションの概要は以下のような感じです。
大まかに、以下のような手順で処理・機能を追加していきます。
- ツールボタンからダイアログを開いて、ファイルを選択する。
- 選択したファイルをラベルに表示
- convertボタンを押すと、各アルゴリズムでハッシュ値を算出する。
- 算出したハッシュ値を各ラベルに表示させる。
こんな流れでまとめていきます。
開発した環境
OS:Linux Mint 18.1 Serena
VirtualBox:6.1.4
QtCreator:3.5.1(Based on Qt5.5.1)
QtDesignerでGUIを作成
まずQtDesignerでGUIを作成していきます。
QtCreatorを開いて、Designボタンをクリックします。
.uiファイルを開いたら、左側のUI部品をMainWindowに追加していきます。
今回使用したウィンドウに配置した「オブジェクト」と「オブジェクト名」の対応表をまとめました。
UI部分はこんな感じでできたらOKです。
次にファイルをダイアログから選択する機能を追加しましょう。
スロットを設定する
先ほど、配置したツールボタンとCreateボタンの2種類のボタンにスロットを設定します。
ヘッダーファイルを完成させましょう。
追加するスロットは、ボタンにクリックイベントです。
#ifndef QMKMD5_H
#define QMKMD5_H
#include <QWidget>
namespace Ui {
class qmkmd5;
}
class qmkmd5 : public QWidget
{
Q_OBJECT
public:
explicit qmkmd5(QWidget *parent = 0);
~qmkmd5();
private slots:
void on_QButton_clicked();
void on_toolButton_clicked();
private:
Ui::qmkmd5 *ui;
};
#endif // QMKMD5_H
ダイアログからファイルを選択する
フォルダを開いてファイルを選択するコードは以下の通りです。
qmkmd5.cpp
//ToolButton:Click Ivent
void qmkmd5::on_toolButton_clicked()
{
QString selFilter=tr("*");
QString stCurrent = QDir::currentPath();
QString fileName = QFileDialog::getOpenFileName(this, tr("ファイルを開く"), stCurrent , tr("すべて(*.*)"), &selFilter,QFileDialog::DontUseCustomDirectoryIcons);
ui->label_File->setText(fileName);
}
ファイルをダイアログから選択するには以下のクラスを選択します。
クラス名 | 操作内容 |
QDir | カレントディレクトリの取得 |
QString | ファイル名の取得 |
QString | ファイルタイプ |
QFileDialog | ダイアログを開く |
ダイアログはクラスQFileDialogのgetOpenFileContent関数を使用します。
この関数はOSのデフォルトのダイアログを使用して、選択したファイルを選択します。
公式ドキュメント:https://doc.qt.io/qt-5/qfiledialog.html
この操作は、ツールボタンをクリックした時のイベントとして実装します。
選択したファイル名をQLabelに表示する方法は以下のコードです。
ui->label_File->setText(fileName);
次に、ハッシュ値を算出する関数を作成します。
Qt5でハッシュ値を算出する関数を実装
選択したファイルのハッシュ値を算出する関数は準備しておきましょう。
QByteArray型のfileChecksumという関数名で作成します。
QByteArray fileChecksum(const QString &Fname, QCryptographicHash::Algorithm hashAlgoritm)
{
QFile f(Fname);
if(f.open(QFile::ReadOnly)){
QCryptographicHash hash(hashAlgoritm);
if(hash.addData(&f)){
return hash.result().toHex();
}
}
return QByteArray();
}
使用するクラスは以下の通りです。
クラス名 | 機能 | 操作内容 |
QByteArray | QByteArray | バイト型の配列を準備 |
QFile | open | ファイルを開く |
QCryptographicHash | Algorithm | ハッシュ値アルゴリズムの指定 |
QCryptographicHash | addData | ハッシュ値を算出する対象ファイルデータの追加 |
fileChecksum関数は、対象ファイルを読み取り専用(ReadOnly)で開き、ハッシュ値を算出しバイト型の配列に格納していきます。
ハッシュ値はバイトを16進数に変更する必要があるため、toHex()を使用します。
それでは最後に、Convertボタンをクリックしてラベルにハッシュ値を転記する動作を実装します。
Convertボタンにハッシュ値表示機能を実装
Convertボタンに各ラベルにハッシュ値を転記する機能を実装します。
//Button:Click Ivent
void qmkmd5::on_QButton_clicked()
{
QString fileName = ui->label_File->text().toUtf8();
if(fileName.isEmpty()){
//キャンセル
}else{
//MD5
QByteArray aryMD5 = fileChecksum(fileName,QCryptographicHash::Md5);
QString Qhash_MD5 = QString::fromUtf8(aryMD5);
ui->label_md5->setText(Qhash_MD5);
//MD4
QByteArray aryMD4 = fileChecksum(fileName,QCryptographicHash::Md4);
QString Qhash_MD4 = QString::fromUtf8(aryMD4);
ui->label_md4->setText(Qhash_MD4);
//SHA1
QByteArray arySHA1 = fileChecksum(fileName,QCryptographicHash::Sha1);
QString Qhash_SHA1 = QString::fromUtf8(arySHA1);
ui->label_SHA1->setText(Qhash_SHA1);
//SHA256
QByteArray arySHA256 = fileChecksum(fileName,QCryptographicHash::Sha256);
QString Qhash_SHA256 = QString::fromUtf8(arySHA256);
ui->label_SHA256->setText(Qhash_SHA256);
//SHA5512
QByteArray arySHA512 = fileChecksum(fileName,QCryptographicHash::Sha512);
QString Qhash_SHA512 = QString ::fromUtf8(arySHA512);
ui->text_SHA512->setText(Qhash_SHA512);
}
}
ファイル名は「label_File」から取得し、もしファイル名が空だった場合は何も処理しません。
各ハッシュ関数のアルゴリズムごとにハッシュ値を各ラベルに転記します。
これで各機能の紹介は以上です。
最後にビルド・コンパイルしましょう。方法は以下の記事にまとめました。
ファイルのハッシュ値算出 ソースコード
qmkmd5.h
#ifndef QMKMD5_H
#define QMKMD5_H
#include <QWidget>
namespace Ui {
class qmkmd5;
}
class qmkmd5 : public QWidget
{
Q_OBJECT
public:
explicit qmkmd5(QWidget *parent = 0);
~qmkmd5();
private slots:
void on_QButton_clicked();
void on_toolButton_clicked();
private:
Ui::qmkmd5 *ui;
};
#endif // QMKMD5_H
qmkmd5.cpp
#include "qmkmd5.h"
#include "ui_qmkmd5.h"
#include <QCryptographicHash>
#include <QByteArray>
#include <QFileDialog>
#include <QPropertyAnimation>
#include <QDebug>
qmkmd5::qmkmd5(QWidget *parent) :
QWidget(parent),
ui(new Ui::qmkmd5)
{
ui->setupUi(this);
}
qmkmd5::~qmkmd5()
{
delete ui;
}
// Calculation a Hasu value
QByteArray fileChecksum(const QString &Fname, QCryptographicHash::Algorithm hashAlgoritm)
{
QFile f(Fname);
if(f.open(QFile::ReadOnly)){
QCryptographicHash hash(hashAlgoritm);
if(hash.addData(&f)){//addData(const char* data, intlength)
return hash.result().toHex();
}
}
return QByteArray();
}
//Button:Click Ivent
void qmkmd5::on_QButton_clicked()
{
QString fileName = ui->label_File->text().toUtf8();
if(fileName.isEmpty()){
//キャンセル
}else{
//MD5
QByteArray aryMD5 = fileChecksum(fileName,QCryptographicHash::Md5);
QString Qhash_MD5 = QString::fromUtf8(aryMD5);
ui->label_md5->setText(Qhash_MD5);
//MD4
QByteArray aryMD4 = fileChecksum(fileName,QCryptographicHash::Md4);
QString Qhash_MD4 = QString::fromUtf8(aryMD4);
ui->label_md4->setText(Qhash_MD4);
//SHA1
QByteArray arySHA1 = fileChecksum(fileName,QCryptographicHash::Sha1);
QString Qhash_SHA1 = QString::fromUtf8(arySHA1);
ui->label_SHA1->setText(Qhash_SHA1);
//SHA256
QByteArray arySHA256 = fileChecksum(fileName,QCryptographicHash::Sha256);
QString Qhash_SHA256 = QString::fromUtf8(arySHA256);
ui->label_SHA256->setText(Qhash_SHA256);
//SHA5512
QByteArray arySHA512 = fileChecksum(fileName,QCryptographicHash::Sha512);
QString Qhash_SHA512 = QString ::fromUtf8(arySHA512);
ui->text_SHA512->setText(Qhash_SHA512);
}
}
//ToolButton:Click Ivent
void qmkmd5::on_toolButton_clicked()
{
QString selFilter=tr("*");
QString stCurrent = QDir::currentPath();
QString fileName = QFileDialog::getOpenFileName(this, tr("ファイルを開く"), stCurrent , tr("すべて(*.*)"), &selFilter,QFileDialog::DontUseCustomDirectoryIcons);
ui->label_File->setText(fileName);
}
// Change Color
まとめ
今回はファイルのハッシュ関数を算出する簡単なアプリケーションを作成しました。
今回アプリケーションを作成するに当たって、参考にしたサイトを以下にまとめました。
ハッシュ値算出
ダイアログの表示
公式ドキュメント
コメント