【C++でアプリ開発】Qtを使ってGUIの電卓アプリを作成②(分岐を複雑にして入力の幅を広げる)

C++

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

スポンサーリンク

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

前回作成した電卓は簡略化のために「1+1=」のように「数値」→「演算子」→「数値」→「=」と入力を限定して「1+1+1」のような計算は禁止していました。今回は機能を追加して「1+1+1=」のような入力も可能にします。

【注記】
今回は簡略化のために「1+1+1」のような計算は禁止して「1+1=」のように「数値」→「演算子」→「数値」→「=」と入力する電卓を作成します。

開発環境

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

ソースコードの追加

前回のソースコードを以下のように変更します。『※今回修正』としている部分になります。

#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 = "+";

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

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

    func_flag = true;
}

//―を押されたときの処理 ※今回修正
void MainWindow::on_pushButton_minus_released()
{
    func = "-";

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

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

    func_flag = true;
}

//×を押されたときの処理 ※今回修正
void MainWindow::on_pushButton_mult_released()
{
    func = "*";

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

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

    func_flag = true;
}

//÷を押されたときの処理 ※今回修正
void MainWindow::on_pushButton_div_released()
{
    func = "/";

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

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

    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 = view;

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

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

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

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

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

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

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

この変更により
・1+1+3 =
・2×3×4=
このような入力も可能になりました。