#include "encryptwindow.h"
#include "ui_encryptwindow.h"
#include <QFile>
#include <QDataStream>
#include <QClipboard>
// 建構函數
EncryptWindow::EncryptWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::EncryptWindow),
e(nullptr)
{
ui->setupUi(this);
}
// 解構函數
EncryptWindow::~EncryptWindow()
{
delete ui;
}
// 將 string 轉換成 QString
QString EncryptWindow::s2q(const string &s)
{
return QString(QString::fromLocal8Bit(s.c_str()));
}
// 將 QString 轉換成 string
string EncryptWindow::q2s(const QString &s)
{
return string((const char *)s.toLocal8Bit());
}
// 按下「新建」按鈕的事件
void EncryptWindow::on_pushButton_new_clicked()
{
e = new Encrypt();
ui->label_display->setText(s2q(e->get_code_array()));
}
// 按下「儲存」按鈕的事件
void EncryptWindow::on_pushButton_save_clicked()
{
// 先測試是否有按過「新建」按鈕
if (e != nullptr) {
// 有按過「新建」按鈕,建立檔名 encryptor 的 QFile 物件
QFile file("encryptor");
// 以寫入模式開啟檔案
file.open(QIODevice::WriteOnly);
// 建立 QDataStream 物件讀取檔案串流
QDataStream out(&file);
// 從 QDataStream 物件將密碼表輸出到檔案
out << s2q(e->get_code_array());
// 最後在 label_display 顯示提示訊息
ui->label_display->setText("已儲存。");
}
else {
// 沒按過「新建」按鈕,在 label_display 顯示提示訊息
ui->label_display->setText("無編碼物件,無法儲存。");
}
}
// 按下「載入」按鈕的事件
void EncryptWindow::on_pushButton_load_clicked()
{
// 建立檔名 encryptor 的 QFile 物件
QFile file("encryptor");
// 以唯讀模式開啟,先測試檔案存不存在
if (file.open(QIODevice::ReadOnly)) {
// 檔案存在,建立 QDataStream 物件讀取檔案串流
QDataStream in(&file);
// 建立一個 QString 字串暫存密碼表
QString temp;
// 從 QDataStream 物件將密碼表輸出到 QString 字串
in >> temp;
// 如果使用者沒按過「新建」,先新建成員變數 e
if (e == nullptr) {
e = new Encrypt;
}
// 將密碼表寫入成員變數 e
e->set_code_array(q2s(temp));
// 最後在 label_display 顯示提示訊息
ui->label_display->setText("編碼物件已載入。");
}
else {
// 檔案不存在,在 label_display 顯示提示訊息
ui->label_display->setText("編碼物件無法載入。");
}
}
// 按下「編碼」按鈕的事件
void EncryptWindow::on_pushButton_encode_clicked()
{
// 取得使用者輸入的英文句子
input_text = ui->lineEdit_input->text();
// 先測試使用者是否有輸入
if (input_text == "") {
// 使用者沒有輸入,在 label_display 顯示提示訊息
ui->label_display->setText("沒有輸入字串!");
}
else {
// 使用者有輸入,測試使用者是否有按過「新建」按鈕
if (e == nullptr) {
// 沒按過「新建」按鈕,在 label_display 顯示提示訊息
ui->label_display->setText("沒有編碼物件!");
}
else {
// 有按過「新建」按鈕,進行編碼工作並將結果顯示在 lineEdit_output
output_text = s2q(e->ToEncode(q2s(input_text)));
ui->lineEdit_output->setText(output_text);
ui->label_display->setText("結果如上");
}
}
}
// 按下「解碼」按鈕的事件
void EncryptWindow::on_pushButton_decode_clicked()
{
// 取得使用者輸入的英文句子
input_text = ui->lineEdit_input->text();
// 先測試使用者是否有輸入
if (input_text == "") {
// 使用者沒有輸入,在 label_display 顯示提示訊息
ui->label_display->setText("沒有輸入字串!");
}
else {
// 使用者有輸入,測試使用者是否有按過「新建」按鈕
if (e == nullptr) {
// 沒按過「新建」按鈕,在 label_display 顯示提示訊息
ui->label_display->setText("沒有編碼物件!");
}
else {
// 有按過「新建」按鈕,進行編碼工作並將結果顯示在 lineEdit_output
output_text = s2q(e->ToDecode(q2s(input_text)));
ui->lineEdit_output->setText(output_text);
ui->label_display->setText("結果如上");
}
}
}
// 按下「清除」按鈕的事件
void EncryptWindow::on_pushButton_clear_clicked()
{
// 將暫存變數及輸出入欄位都設成空字串
input_text = "";
output_text = "";
ui->lineEdit_input->setText("");
ui->lineEdit_output->setText("");
// 將 e 設定為 nullptr
e = nullptr;
ui->label_display->setText("已清除所有內容。");
}
// 按下「拷貝」按鈕的事件
void EncryptWindow::on_pushButton_copy_clicked()
{
// QClipboard 物件將文字拷貝到系統剪貼簿
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(output_text);
ui->label_display->setText("已拷貝結果到剪貼簿。");
}
// 輸入文字的事件
void EncryptWindow::on_lineEdit_input_textChanged(const QString &arg1)
{
ui->label_display->setText("輸入是 \"" + arg1 + "\"");
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:encryptwindow.cpp
功能:Encrypt Qt 類別的實作檔
作者:張凱慶 */