C++ 入門指南

encryptwindow.cpp

本書已有新版,請參考 C++ 入門指南 4.01 - 範例程式篇 - encryptcontroller.cpp

#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 類別的實作檔
   作者:張凱慶 */

回 C++ 入門指南目錄
回 C++ 教材
回程式語言教材首頁