【Qt Widgets】数値入力ダイアログでユーザー入力をスムーズに処理!QInputDialog::doubleValueChanged()徹底解説


QInputDialog::doubleValueChanged() は、Qt Widgetsライブラリで提供される QInputDialog クラスのシグナルです。このシグナルは、QInputDialog ダイアログ内の数値入力フィールドにおける値が変更されるたびにemitされます。開発者は、このシグナルを接続して、値変更イベントに応じた処理を実行することができます。

シグナルの役割

QInputDialog::doubleValueChanged() シグナルは、ユーザーが QInputDialog ダイアログ内のスピンボックスやスライダーなどの数値入力コントロールを操作した際に、その変更を検知し、対応する処理を実行するために使用されます。具体的には、以下の用途に役立ちます。

  • 計算処理の実行
    入力された値に基づいて、計算処理を実行することができます。
  • 入力値の検証
    ユーザーが入力した値が有効な範囲内であるかどうかを確認し、必要に応じてエラーメッセージを表示することができます。

シグナルの接続方法

QInputDialog::doubleValueChanged() シグナルを接続するには、以下のコードのように QObject::connect() 関数を使用します。

QInputDialog dialog;
dialog.getDouble(this, "数値入力", "値を入力してください:", 0.0, -100.0, 100.0);

connect(&dialog, &QInputDialog::doubleValueChanged, this, &MyClass::onValueChanged);

上記のコードでは、MyClass クラスの onValueChanged メソッドがシグナルスロットとして登録されています。このメソッドは、double 型の引数 value を受け取り、入力された値に基づいて処理を実行します。

シグナル引数の詳細

QInputDialog::doubleValueChanged() シグナルは、以下の引数を渡します。

  • value: ユーザーが入力した現在の数値

以下のコード例は、QInputDialog ダイアログを使用してユーザーから数値を入力し、その平方根を計算する例です。

#include <QtWidgets/QApplication>
#include <QtWidgets/QInputDialog>
#include <cmath>

class MyClass : public QObject {
public:
    MyClass() {
        connect(this, &MyClass::doubleValueChanged, this, &MyClass::onValueChanged);
    }

signals:
    void doubleValueChanged(double value);

private slots:
    void onValueChanged(double value) {
        double sqrtValue = std::sqrt(value);
        QMessageBox::information(this, "平方根", QString("入力値 %1 の平方根は %2 です").arg(value).arg(sqrtValue));
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MyClass myClass;

    QInputDialog dialog;
    double value = dialog.getDouble(&myClass, "数値入力", "値を入力してください:", 0.0, -100.0, 100.0);

    if (dialog.exec() == QDialog::Accepted) {
        myClass.doubleValueChanged(value);
    }

    return app.exec();
}

この例では、MyClass クラスの onValueChanged メソッドがシグナルスロットとして登録されています。このメソッドは、入力された値の平方根を計算し、メッセージボックスに表示します。

  • QInputDialog::doubleValueChanged() シグナルは、Qt Widgets 5.0以降で使用可能です。
  • QInputDialog クラスは、テキスト入力、ファイル選択、日付選択など、さまざまな種類のダイアログを提供しています。


#include <QtWidgets/QApplication>
#include <QtWidgets/QInputDialog>
#include <cmath>

class MyClass : public QObject {
public:
    MyClass() {
        connect(this, &MyClass::doubleValueChanged, this, &MyClass::onValueChanged);
    }

signals:
    void doubleValueChanged(double value);

private slots:
    void onValueChanged(double value) {
        double sqrtValue = std::sqrt(value);
        QMessageBox::information(this, "平方根", QString("入力値 %1 の平方根は %2 です").arg(value).arg(sqrtValue));
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MyClass myClass;

    QInputDialog dialog;
    double value = dialog.getDouble(&myClass, "数値入力", "値を入力してください:", 0.0, -100.0, 100.0);

    if (dialog.exec() == QDialog::Accepted) {
        myClass.doubleValueChanged(value);
    }

    return app.exec();
}
#include <QtWidgets/QApplication>
#include <QtWidgets/QInputDialog>
#include <QtCharts/QChart>
#include <QtCharts/QSeries>

class MyClass : public QObject {
public:
    MyClass() {
        connect(this, &MyClass::doubleValueChanged, this, &MyClass::updateChart);
        chart = new QChart();
        series = new QSeries();
        chartView = new QChartView(chart, this);
        chartView->setFixedSize(400, 300);
    }

signals:
    void doubleValueChanged(double value);

private slots:
    void updateChart(double value) {
        series->append(x, value);
        chart->setAxisXBottom(new QValueAxis());
        chart->addSeries(series);
        chart->legend()->setVisible(false);
        chartView->update();
        x++;
    }

private:
    QChart *chart;
    QSeries *series;
    QChartView *chartView;
    int x = 0;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    MyClass myClass;

    QInputDialog dialog;
    double value = dialog.getDouble(&myClass, "数値入力", "値を入力してください:", 0.0, 0.0, 100.0);

    if (dialog.exec() == QDialog::Accepted) {
        myClass.doubleValueChanged(value);
    }

    myClass.show();

    return app.exec();
}


QLineEdit::textChanged() シグナル

QLineEdit ウィジェットを使用している場合は、textChanged() シグナルを接続して、ユーザーがテキストを入力するたびに処理を実行することができます。このシグナルは、入力されたテキストが文字列であるため、数値入力にのみ適しているわけではありませんが、単純な値変更検知には有効です。


QLineEdit *lineEdit = new QLineEdit(this);
connect(lineEdit, &QLineEdit::textChanged, this, &MyClass::onTextChanged);

QValidator::validate() メソッド

QValidator クラスを使用して、入力値の正当性を検証することができます。validate() メソッドは、入力値が有効かどうかを返します。このメソッドを定期的に呼び出すことで、値変更を検知し、必要に応じて処理を実行することができます。


QDoubleValidator *validator = new QDoubleValidator(0.0, 100.0, 2, this);
lineEdit->setValidator(validator);

connect(validator, &QValidator::stateChanged, this, &MyClass::onValidatorStateChanged);

タイマーを使用した定期的なチェック

タイマーを使用して、定期的に入力値をチェックすることもできます。これは、シグナルを使用しないシンプルな方法ですが、CPU使用量が増加する可能性があります。


QTimer *timer = new QTimer(this);
timer->setInterval(100);
connect(timer, &QTimer::timeout, this, &MyClass::onTimer);

カスタムイベントを使用する

カスタムイベントを使用して、入力値変更を通知することができます。これは、より複雑なシナリオに適している方法です。


class MyLineEdit : public QLineEdit {
public:
    void emitValueChanged() {
        emit valueChanged(text());
    }
};

MyLineEdit *lineEdit = new MyLineEdit(this);
connect(lineEdit, &MyLineEdit::valueChanged, this, &MyClass::onValueChanged);
方法利点欠点
QLineEdit::textChanged()シンプル数値入力にのみ適している
QValidator::validate()入力値の正当性を検証できるCPU使用量が増加する可能性がある
タイマーを使用した定期的なチェックシンプルCPU使用量が増加する可能性がある
カスタムイベントを使用する複雑なシナリオに適しているコードが複雑になる