【保存版】Qt Widgets:QInputDialog::getDouble()を使いこなして、もっと便利に入力フォームを作成


QInputDialog::getDouble()は、Qt Widgetsライブラリの一部であるQInputDialogクラスの静的関数です。この関数は、ユーザーから浮動小数点数の入力を取得するために使用されます。

機能

QInputDialog::getDouble()は以下の機能を提供します。

  • ユーザーが入力操作を完了したかどうかを通知します。
  • 入力値が有効範囲内にあるかどうかを検証します。
  • ユーザーが入力した浮動小数点数を入力フィールドから取得します。
  • ダイアログウィンドウを表示し、ユーザーにラベルと初期値を表示します。

引数

QInputDialog::getDouble()は以下の引数を取ります。

  • step: スピンボックスのステップ値。
  • flags: ダイアログウィンドウのウィンドウフラグ。
  • ok: 出力引数。ユーザーが入力操作を完了したかどうかを示すフラグ。
  • decimals: 小数点以下の桁数。
  • max: 最大値。ユーザーが入力できる最大値。
  • min: 最小値。ユーザーが入力できる最小値。
  • value: 初期値。入力フィールドに最初に表示される値。
  • label: ラベルテキスト。入力フィールドの横に表示されます。
  • title: ダイアログウィンドウのタイトルバーに表示されるテキスト。
  • parent: 親ウィジェット。ダイアログウィンドウをこのウィジェットに関連付けます。

戻り値

QInputDialog::getDouble()は以下の値を返します。

  • ユーザーが入力した浮動小数点数。入力操作がキャンセルされた場合は0を返します。

以下の例は、QInputDialog::getDouble()を使用して、ユーザーから温度を入力し、華氏から摂氏への変換を行うコードを示しています。

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

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

  double celsius;
  bool ok;

  celsius = QInputDialog::getDouble(nullptr, "温度変換", "華氏を入力してください:", 72.0, 0.0, 212.0, 1, &ok);

  if (ok) {
    double fahrenheit = celsius * 9.0 / 5.0 + 32.0;
    QMessageBox::information(nullptr, "温度変換", QString("摂氏: %1").arg(fahrenheit));
  } else {
    QMessageBox::information(nullptr, "温度変換", "キャンセルされました");
  }

  return app.exec();
}
  • ダイアログウィンドウのカスタマイズは、QInputDialogクラスの他のメンバー関数を使用して行うことができます。
  • QInputDialog::getDouble()は、ユーザー入力を検証するためにQValidatorクラスを使用することができます。


ユーザーから半径を入力し、円周と面積を計算する

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

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

  double radius;
  bool ok;

  radius = QInputDialog::getDouble(nullptr, "円周と面積の計算", "半径を入力してください:", 1.0, 0.0, 10.0, 1, &ok);

  if (ok) {
    double circumference = 2.0 * M_PI * radius;
    double area = M_PI * radius * radius;

    QMessageBox::information(nullptr, "円周と面積の計算",
                             QString("円周: %1\n面積: %2")
                             .arg(circumference)
                             .arg(area));
  } else {
    QMessageBox::information(nullptr, "円周と面積の計算", "キャンセルされました");
  }

  return app.exec();
}

ユーザーから料金と税率を入力し、合計金額を計算する

この例では、QInputDialog::getDouble()を使用してユーザーから料金と税率を入力し、合計金額を計算します。

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

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

  double price;
  double taxRate;
  bool ok;

  price = QInputDialog::getDouble(nullptr, "合計金額の計算", "商品料金を入力してください:", 100.0, 0.0, 1000.0, 1, &ok);

  if (ok) {
    taxRate = QInputDialog::getDouble(nullptr, "合計金額の計算", "税率を入力してください:", 0.05, 0.0, 1.0, 0.01, &ok);

    if (ok) {
      double total = price * (1.0 + taxRate);

      QMessageBox::information(nullptr, "合計金額の計算",
                             QString("合計金額: %1")
                             .arg(total));
    } else {
      QMessageBox::information(nullptr, "合計金額の計算", "税率の入力がキャンセルされました");
    }
  } else {
    QMessageBox::information(nullptr, "合計金額の計算", "料金の入力がキャンセルされました");
  }

  return app.exec();
}

この例では、QInputDialog::getText()QInputDialog::getDouble()を使用してユーザーから名前と年齢を入力し、挨拶文を表示します。

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

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

  QString name;
  bool ok;

  name = QInputDialog::getText(nullptr, "挨拶", "名前を入力してください:", &ok);

  if (ok) {
    double age;
    age = QInputDialog::getDouble(nullptr, "挨拶", "年齢を入力してください:", 20, 0, 100, 1, &ok);

    if (ok) {
      QMessageBox::information(nullptr, "挨拶",
                             QString("こんにちは、%1さん!\n年齢は%2歳ですね。")
                             .arg(name)
                             .arg(age));
    } else {
      QMessageBox::information(nullptr, "挨拶", "年齢の入力がキャンセルされました");
    }
  } else {
    QMessageBox::information(nullptr, "挨拶", "名前の入力がキャンセルされました");
  }

  return app.exec();
}
  • Qt Widgetsライブラリは、C++とPythonで利用できます。
  • 上記の例は、Qt Widgetsライブラリの基本的な機能のみを示しています。より複雑な機能については、Qtドキュメントを参照してください。


代替方法

以下に、QInputDialog::getDouble() の代替方法をいくつか紹介します。

QLineEdit と QValidator

  • QValidator::DoubleValidator クラスを使用して、浮動小数点数の入力を検証します。
  • QValidator クラスを使用して、入力値の形式を検証します。
  • QLineEdit ウィジェットを使用して、ユーザーに入力フィールドを提供します。
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QValidator>

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

  QWidget widget;

  QLineEdit *lineEdit = new QLineEdit(&widget);
  lineEdit->setValidator(new QDoubleValidator(0.0, 100.0, 2, lineEdit));

  widget.show();

  return app.exec();
}

QSpinBox

  • QSpinBoxvalue() メソッドを使用して、入力値を取得します。
  • QSpinBox ウィジェットを使用して、ユーザーにスピンボックスを提供します。
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QSpinBox>

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

  QWidget widget;

  QSpinBox *spinBox = new QSpinBox(&widget);
  spinBox->setRange(0, 100);
  spinBox->setSingleStep(2);

  widget.show();

  return app.exec();
}

カスタムダイアログ

  • ダイアログ内に QLineEdit ウィジェットと QValidator クラスを使用して、入力値の形式を検証します。
  • QDialog クラスを継承して、カスタムダイアログを作成します。
  • カスタムダイアログを作成して、ユーザーに入力フィールドと検証ロジックを提供します。

これらの代替方法は、それぞれ異なる利点と欠点があります。状況に応じて適切な方法を選択してください。

方法利点欠点
QLineEdit と QValidatorシンプルで使いやすい入力形式の検証が複雑になる場合がある
QSpinBox数値入力に適している入力範囲が限られている
カスタムダイアログ柔軟性が高い開発コストが高い
  • 開発者のスキルと経験
  • ユーザーインターフェースの要件
  • 入力値の形式要件