プロジェクトに新規ファイル追加
前回は正規表現を使いlineEditに入力する文字を制限しました(正規表現の解説はこちら)。今回は正規表現の機能を持ったlineEditを使う際、毎回コードを書くのは大変なので正規表現の機能をlineEditに組み込むやり方を紹介します。この方法を「格上げ」と言い、1度コードを作れば次に使う時はそのコードファイルをインポートしてmainのヘッダーファイルで一手間加えるだけで正規表現を使えるようになります。これを「カスタムウィジェット」と言います。lineEdit以外のウィジェットにも使えるのでとても便利です。まずは下記手順で新規ファイルを作ります。

vallineedit.hに下記コードを入力します。
ヘッダーファイル
#ifndef VALHEADER_H
#define VALHEADER_H
#include <QLineEdit>
class QRegExpValidator;
class ValLineEdit:public QLineEdit
{
Q_OBJECT
public:
ValLineEdit(QWidget *parent=nullptr);
private:
QRegExpValidator *vld;
};
#endif // VALHEADER_H
vallineedit.cppに下記コードを入力します。
ソースファイル
#include <QtGui>
#include "vallineedit.h"
ValLineEdit::ValLineEdit(QWidget *parent):QLineEdit(parent)
{
QRegExp reg("[0-9]{1,}[.][0-9]{2}"); //正規表現設定
vld=new QRegExpValidator(reg);
setValidator(vld);
}
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);
}
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(); //電流値代入
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)); //電流表示
}
}
レイアウト上にあるlineEditを下記手順で格上げします。
格上げ手順

格上げを実施したら実行してみましょう。数字と小数点しか入力できなくなったかと思います。このように不要な文字に入力制限を設けてバグを防ぐことができます。次回はlineEditに入力した文字をクリアする機能を実装します。