【C++でアプリ開発】Qtを使ってGUIの電卓アプリを作成③(メモリを追加して過去の計算結果も表示する)

C++

【対象の方】
・Qtを使用して簡単な電卓を作成したい
・Push BottunやText Viewの使い方を学びたい
・言語はC++

Qtを使ってGUIの電卓アプリを作成③

今回は以下のように過去の計算結果や現在選択中の演算子を表示する電卓を作成します。

開発環境

・OS : Windows10 64bit
・Qt Creator 4.14.2/Based on Qt 5.15.2 (MSVC 2019, 64 bit)

Text Labelの追加

今回が第3回目になりますが、第1回目から以下を追加します。

『Label』を2個ドラッグアンドドロップして配置してください。

追加した左側を『label_memory』とし、右側を『label_func』と変更します。

追加したTextLabelを1つ選択してQLabelの『text』を空欄にしてEnterキーを押して下さい。初期値を値なしにします。これを追加した2個とも行います。

ソースコード

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>

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

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

QString view = "0";             //表示するための変数
QString func;                     //演算を格納する変数
QString result_memory = "0";    //結果を一時的に格納する変数
bool func_flag = false;           //演算のどれかを押されたら変化するフラグ

int result;         //数値の計算結果

//1を押されたときの処理
void MainWindow::on_pushButton_1_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "1";
        func_flag = false;
    } else {
        view += "1";
    }
    ui->label_view->setText(view);
}

//2を押されたときの処理
void MainWindow::on_pushButton_2_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "2";
        func_flag = false;
    } else {
        view += "2";
    }
    ui->label_view->setText(view);
}

//3を押されたときの処理
void MainWindow::on_pushButton_3_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "3";
        func_flag = false;
    } else {
        view += "3";
    }
    ui->label_view->setText(view);
}

//4を押されたときの処理
void MainWindow::on_pushButton_4_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "4";
        func_flag = false;
    } else {
        view += "4";
    }
    ui->label_view->setText(view);
}

//4を押されたときの処理
void MainWindow::on_pushButton_5_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "5";
        func_flag = false;
    } else {
        view += "5";
    }
    ui->label_view->setText(view);
}

//6を押されたときの処理
void MainWindow::on_pushButton_6_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "6";
        func_flag = false;
    } else {
        view += "6";
    }
    ui->label_view->setText(view);
}

//7を押されたときの処理
void MainWindow::on_pushButton_7_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "7";
        func_flag = false;
    } else {
        view += "7";
    }
    ui->label_view->setText(view);
}

//8を押されたときの処理
void MainWindow::on_pushButton_8_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "8";
        func_flag = false;
    } else {
        view += "8";
    }
    ui->label_view->setText(view);
}

//9を押されたときの処理
void MainWindow::on_pushButton_9_released()
{
    if ((view == "0") || (func_flag == true)){
        view = "9";
        func_flag = false;
    } else {
        view += "9";
    }
    ui->label_view->setText(view);
}

//0を押されたときの処理
void MainWindow::on_pushButton_0_released()
{
    if (view == "0"){
        view = "0";
    } else {
        view += "0";
    }
    ui->label_view->setText(view);
}

//+を押されたときの処理
void MainWindow::on_pushButton_plus_released()
{
    func = "+";
    ui->label_func->setText(func);

    if (result_memory != "0"){
        result  = result_memory.toInt() + view.toInt();

        view = QString::number(result);
        ui->label_view->setText(view);
        result_memory = view;
        ui->label_memory->setText(result_memory);
    } else {
        result  = view.toInt();
        ui->label_memory->setText(result_memory);
        result_memory = view;
        ui->label_memory->setText(result_memory);
    }

    func_flag = true;
}

//―を押されたときの処理
void MainWindow::on_pushButton_minus_released()
{
    func = "-";
    ui->label_func->setText(func);

    if (result_memory != "0"){
        result  = result_memory.toInt() - view.toInt();

        view = QString::number(result);
        ui->label_view->setText(view);
        result_memory = view;
        ui->label_memory->setText(result_memory);
    } else {
        result  = view.toInt();
        result_memory = view;
        ui->label_memory->setText(result_memory);
    }

    func_flag = true;
}

//×を押されたときの処理
void MainWindow::on_pushButton_mult_released()
{
    func = "*";
    ui->label_func->setText(func);

    if (result_memory != "0"){
        result  = result_memory.toInt() * view.toInt();

        view = QString::number(result);
        ui->label_view->setText(view);
        result_memory = view;
        ui->label_memory->setText(result_memory);
    } else {
        result  = view.toInt();
        result_memory = view;
        ui->label_memory->setText(result_memory);
    }

    func_flag = true;
}

//÷を押されたときの処理
void MainWindow::on_pushButton_div_released()
{
    func = "/";
    ui->label_func->setText(func);

    if (result_memory != "0"){
        result  = result_memory.toInt() / view.toInt();

        view = QString::number(result);
        ui->label_view->setText(view);
        result_memory = view;
        ui->label_memory->setText(result_memory);
    } else {
        result  = view.toInt();
        result_memory = view;
        ui->label_memory->setText(result_memory);
    }

    func_flag = true;
}

//=を押されたときの処理
void MainWindow::on_pushButton_equal_released()
{
    if (func == "+"){
        result  = result_memory.toInt() + view.toInt();

        view = QString::number(result);
        ui->label_view->setText(view);
        result_memory = "0";

    } else if (func == "-"){
        result  = result_memory.toInt() - view.toInt();

        view = QString::number(result);
        ui->label_view->setText(view);
        result_memory = "0";

    } else if (func == "*"){
        result  = result_memory.toInt() * view.toInt();

        view = QString::number(result);
        ui->label_view->setText(view);
        result_memory = "0";

    } else if (func == "/"){
        result  = result_memory.toInt() / view.toInt();

        view = QString::number(result);
        ui->label_view->setText(view);
        result_memory = "0";
    }
}

//DELを押されたときの処理
void MainWindow::on_pushButton_del_released()
{
    result_memory = "0";
    view = "0";
    ui->label_view->setText(view);

    func = "";
    ui->label_func->setText(func);

    result_memory = view;
    ui->label_memory->setText("");
}

これで過去の計算結果と現在選択中の演算子を表示できるようになりました。