【Qt】コンボボックスを使う


コンボボックスをレイアウト

 前回はタブページを切り替えることでボタンがオームの法則かギア計算かを切り分けられる様、1つのボタンで機能を共有しました(前回の記事)。今回コンボボックスを使ってlabelとlineEditを共有化し、距離速度時間計算機能を追加します。
 まずは下記手順でコンボボックスを配置し、ライベントを作ります。

 コンボボックスの内容を変更するとイベントが起こるようになります。

 イベントでコンボボックスの内容が変わるとcurrentIndexプロパティの値が変更します。その値を格納する為の変数を下記コードの様に作ります。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pB_Do_clicked();
    void on_tabWidget_currentChanged(int index);
    void on_cmbBx_Physics_currentIndexChanged(int index);

private:
    Ui::MainWindow *ui;

    float _E=0;  //電圧
    float _I=0;  //電流
    float _R=0;  //抵抗
    float _D=0;  //直径
    float _Z=0;  //歯数
    float _M=0;  //モジュール

    int _idxTab;  //現在開いているtab
    int _idxPsy;  //追加物理計算インデックス
};
#endif // MAINWINDOW_H

mainwindow.cpp

 続けいて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:
            if(ui->lE_E->text()=="")  //電圧が空白の場合
            {
                _E=_I*_R;  //電圧計算
                ui->lE_E->setText(QString::number(_E));  //電圧表示
            }
            else if(ui->lE_R->text()=="")  //抵抗が空白の場合
            {
                _R=_E/_I;  //抵抗計算
                ui->lE_R->setText(QString::number(_R));  //抵抗表示
            }
            else if(ui->lE_I->text()=="")  //電流が空白の場合
            {
                _I=_E/_R;  //電流計算
                ui->lE_I->setText(QString::number(_I));  //電流表示
            }
            break;
        case 1:
            if(ui->lE_E->text()=="")  //距離が空白の場合
            {
                _E=_I*_R;  //距離計算
                ui->lE_E->setText(QString::number(_E));  //距離表示
            }
            else if(ui->lE_R->text()=="")  //速度が空白の場合
            {
                _R=_E/_I;  //速度計算
                ui->lE_R->setText(QString::number(_R));  //速度表示
            }
            else if(ui->lE_I->text()=="")  //時間が空白の場合
            {
                _I=_E/_R;  //時間計算
                ui->lE_I->setText(QString::number(_I));  //時間表示
            }
            break;
        }
        break;

    case 1:
        if(ui->lE_D->text()=="")  //直径が空白の場合
        {
            _D=_Z*_M;  //直径計算
            ui->lE_D->setText(QString::number(_D));  //直径表示
        }
        else if(ui->lE_Z->text()=="")  //歯数が空白の場合
        {
            _Z=_D/_M;  //歯数計算
            ui->lE_Z->setText(QString::number(_Z));  //歯数表示
        }
        else if(ui->lE_M->text()=="")  //モジュールが空白の場合
        {
            _M=_D/_Z;  //モジュール計算
            ui->lE_M->setText(QString::number(_M));  //モジュール表示
        }
        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("電流");
        break;
    case 1:
        ui->lbl_E->setText("距離");
        ui->lbl_R->setText("速度");
        ui->lbl_I->setText("時間");
        break;
    }
}

 コンボボックスを変更すると変数に値が代入され、その値を条件文で判定し計算方法を判断するアルゴリズムになっています。別の計算を増やしたい場合はコンボボックスの内容追加と、条件文の追加でlabelとlineEditを増やすことなく機能を拡張できます。
 次回はボタンのクリックイベント内のコードが長くて見にくいので、関数化し整理します。

, ,

コメントを残す