【Qt】コンボボックスで単位を変更


概要

前回、ラジオボタンを使ってlineEditとlabelの表示を変更させる機能を実装しました。これにより計算された値と単位が変更できるようになりました(前回の記事)。今回は距離速度時間の単位がオームの法則のままになっているので単位を変更します。今回は以前作ったコンボボックスのイベントを利用します
参照)。mainwindow.cppに以下コードを書きます。

コード

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QRegExpValidator>
#include <QDebug>  //追記

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

    _idxTab=ui->tabWidget->currentIndex();  //開いているtab番号代入
    _idxPsy=0;  //物理計算インデックス初期化
}

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

void MainWindow::on_pB_Do_clicked()
{
    _E=ui->lE_E->text().toFloat();  //電圧代入
    _R=ui->lE_R->text().toFloat();  //抵抗値代入
    _I=ui->lE_I->text().toFloat();  //電流値代入
    _D=ui->lE_D->text().toFloat();  //直径代入
    _Z=ui->lE_Z->text().toFloat();  //歯数代入
    _M=ui->lE_M->text().toFloat();  //モジュール代入

    switch(_idxTab)
    {
    case 0:
        switch (_idxPsy)
        {
        case 0:
            calcOhm();    //オームの法則計算
            break;
        case 1:
            calcDstSpdTm();    //距離速度時間計算
            break;
        }
        break;
    case 1:
        calcModule();    //モージュール計算
        break;
    }
}

//tab切り替え時のイベント
void MainWindow::on_tabWidget_currentChanged(int index)
{
    _idxTab=ui->tabWidget->currentIndex();  //開いているtab番号代入
}

//物理計算内容切り替え時のイベント
void MainWindow::on_cmbBx_Physics_currentIndexChanged(int index)
{
    _idxPsy=index;
    switch (_idxPsy)
    {
    case 0:
        ui->lbl_E->setText("電圧");
        ui->lbl_R->setText("抵抗");
        ui->lbl_I->setText("電流");

        ui->lbl_unitE->setText("V");
        ui->lbl_unitR->setText("Ω");
        ui->lbl_unitI->setText("A");
        break;
    case 1:
        ui->lbl_E->setText("距離");
        ui->lbl_R->setText("速度");
        ui->lbl_I->setText("時間");

        ui->lbl_unitE->setText("m");
        ui->lbl_unitR->setText("m/s");
        ui->lbl_unitI->setText("s");
        break;
    }
}

//今回追加したコード
void MainWindow::on_rB_k_clicked(bool checked)
{
    if(checked==true)  //kに変換
    {
        ui->lE_E->setText(QString::number(_E/1000));
        ui->lE_R->setText(QString::number(_R/1000));
        ui->lE_I->setText(QString::number(_I/1000));

        ui->lbl_unitE->setText("kV");
        ui->lbl_unitR->setText("kΩ");
        ui->lbl_unitI->setText("kA");
    }
}

void MainWindow::on_rB_normal_clicked(bool checked)
{
     if(checked==true)  //normalに変換
     {
         ui->lE_E->setText(QString::number(_E));
         ui->lE_R->setText(QString::number(_R));
         ui->lE_I->setText(QString::number(_I));

         //追加
         ui->lbl_unitE->setText("V");
         ui->lbl_unitR->setText("Ω");
         ui->lbl_unitI->setText("A");
     }
}

void MainWindow::on_rB_m_clicked(bool checked)
{
    if(checked==true)  //に変換
    {
        ui->lE_E->setText(QString::number(_E*1000));
        ui->lE_R->setText(QString::number(_R*1000));
        ui->lE_I->setText(QString::number(_I*1000));

        //追加
        ui->lbl_unitE->setText("mV");
        ui->lbl_unitR->setText("mΩ");
        ui->lbl_unitI->setText("mA");
    }
}

上記コードを実行し、コンボボックスを「オームの法則」から「距離速度時間」に切り替えると単位が変わったと思います。on_comboBox_currentIndexChanged(int index)のindexが0の時はオームの法則、1の時は距離速度時間なので条件文で処理の切り替えを行っています。このコードではselect case分を使っていますがif文でも書くことができます。switch case文はbreakを書き忘れるとうまく動かなくなるので注意してください。
 次回は距離の単位を変更する機能を実装します。電圧・抵抗・電流の時と同じやり方ですが条件文が加わり少し複雑になります。


コメントを残す