【初心者向け】Qt Widgets: ダイアログでユーザー入力を取得!QInputDialog::intValueの基礎


QInputDialog::intValue は、Qt Widgetsライブラリの一部である QInputDialog クラスのメソッドで、ユーザー入力を整数値として取得するために使用されます。このメソッドは、整数値入力ダイアログを表示し、ユーザーが入力した値を返します。

使用方法

QInputDialog::intValue メソッドは、以下の構文で使用されます。

int QInputDialog::intValue(QWidget *parent,
                          const QString &title,
                          const QString &label,
                          int value = 0,
                          int min = INT_MIN,
                          int max = INT_MAX,
                          int step = 1,
                          bool *ok = nullptr,
                          Qt::WindowFlags flags = Qt::WindowFlags());

このメソッドは以下の引数を取ります。

  • flags: ウィンドウフラグ (デフォルトはQt::WindowFlags())
  • ok: ユーザーがOKボタンをクリックしたかどうかを示すフラグ (省略可能)
  • step: スピンボックスのステップ値 (デフォルトは1)
  • max: 最大値 (デフォルトはINT_MAX)
  • min: 最小値 (デフォルトはINT_MIN)
  • value: 初期値 (デフォルトは0)
  • label: 入力ラベル
  • title: ダイアログのタイトル
  • parent: 親ウィジェット (省略可能)

戻り値

ユーザーが入力した整数値が返されます。ユーザーがキャンセルボタンをクリックした場合は、0が返されます。

以下のコードは、ユーザーから年齢を入力するための整数値入力ダイアログを表示し、入力された年齢をコンソールに出力する例です。

int main() {
  int age = QInputDialog::intValue(nullptr, "年齢を入力", "あなたの年齢は:", 20, 0, 120);
  if (age > 0) {
    std::cout << "あなたの年齢は" << age << "歳です。" << std::endl;
  } else {
    std::cout << "キャンセルされました。" << std::endl;
  }
  return 0;
}
  • ダイアログのカスタマイズについては、QInputDialog クラスの他のメソッドを参照してください。
  • QInputDialog::intValue メソッドは、テキスト入力ダイアログ (QInputDialog::getText()) や浮動小数点入力ダイアログ (QInputDialog::getDouble()) と同様に使用できます。


#include <QApplication>
#include <QInputDialog>

int main() {
  QApplication app;

  int age = QInputDialog::intValue(nullptr, "年齢を入力", "あなたの年齢は:", 20, 0, 120);
  if (age > 0) {
    QString name = QInputDialog::getText(nullptr, "名前を入力", "あなたの名前は:");
    if (!name.isEmpty()) {
      std::cout << age << "歳" << name.toStdString() << "さんですね!" << std::endl;
    } else {
      std::cout << "名前を入力しませんでした。" << std::endl;
    }
  } else {
    std::cout << "キャンセルされました。" << std::endl;
  }

  return app.exec();
}

例2:ファイル選択ダイアログと整数値入力ダイアログの組み合わせ

この例では、ファイル選択ダイアログを使用してファイルを選択し、選択したファイルのサイズを整数値入力ダイアログで確認します。

#include <QApplication>
#include <QFileDialog>
#include <QInputDialog>
#include <QFile>

int main() {
  QApplication app;

  QString fileName = QFileDialog::getOpenFileName(nullptr, "ファイルを選択", "", "*");
  if (!fileName.isEmpty()) {
    QFile file(fileName);
    if (file.open(QIODevice::ReadOnly)) {
      int size = file.size();
      file.close();

      int fileSize = QInputDialog::intValue(nullptr, "ファイルサイズ", "選択したファイルのサイズは" + QString::number(size) + "バイトです。確認しますか?", size);
      if (fileSize == size) {
        std::cout << "ファイルサイズが一致しました。" << std::endl;
      } else {
        std::cout << "入力されたサイズが一致しません。" << std::endl;
      }
    } else {
      std::cout << "ファイルを開くことができませんでした。" << std::endl;
    }
  } else {
    std::cout << "ファイルを選択しませんでした。" << std::endl;
  }

  return app.exec();
}

例3:カスタム入力検証

この例では、ユーザーが入力した値が特定の範囲内であることを確認するために、カスタム入力検証関数を設定した整数値入力ダイアログを表示します。

#include <QApplication>
#include <QInputDialog>

bool validateInput(int value) {
  return value >= 10 && value <= 20;
}

int main() {
  QApplication app;

  int value = QInputDialog::intValue(nullptr, "値を入力", "10から20までの値を入力してください:", 15, validateInput);
  if (value > 0) {
    std::cout << "入力された値は" << value << "です。" << std::endl;
  } else {
    std::cout << "キャンセルされました。" << std::endl;
  }

  return app.exec();
}


QLineEdit と QValidator

  • 欠点
    • エラー処理を自分で行う必要がある
    • 入力形式の制限が限られている
  • 利点
    • シンプルで軽量
    • コードがわかりやすい
    • レイアウトの自由度が高い
QLabel label("年齢を入力:");
QLineEdit lineEdit;
lineEdit.setValidator(new QIntValidator(0, 120)); // 最小値と最大値を設定

QHBoxLayout layout;
layout.addWidget(&label);
layout.addWidget(&lineEdit);

QDialog dialog;
dialog.setLayout(layout);
dialog.setWindowTitle("年齢を入力");

int result = dialog.exec();

if (result == QDialog::Accepted) {
  int age = lineEdit.text().toInt();
  std::cout << "あなたの年齢は" << age << "歳です。" << std::endl;
} else {
  std::cout << "キャンセルされました。" << std::endl;
}

QSpinBox

  • 欠点
    • 入力形式が整数値に限定される
    • レイアウトの自由度が低い
  • 利点
    • スピンボタンによる簡単入力
    • 最小値、最大値、ステップ値を設定できる
QLabel label("年齢を入力:");
QSpinBox spinBox(0, 120, 1); // 最小値、最大値、ステップ値を設定

QHBoxLayout layout;
layout.addWidget(&label);
layout.addWidget(&spinBox);

QDialog dialog;
dialog.setLayout(layout);
dialog.setWindowTitle("年齢を入力");

int result = dialog.exec();

if (result == QDialog::Accepted) {
  int age = spinBox.value();
  std::cout << "あなたの年齢は" << age << "歳です。" << std::endl;
} else {
  std::cout << "キャンセルされました。" << std::endl;
}

QFormDialog と QSpinBox

  • 欠点
    • コードが少し複雑になる
    • エラー処理を自分で行う必要がある
  • 利点
    • ラベルと入力フィールドを柔軟に配置できる
    • 入力形式の制限をある程度緩和できる
QFormDialog dialog;
dialog.setWindowTitle("年齢を入力");

QLabel label("年齢:");
QSpinBox spinBox(0, 120, 1);

dialog.addField(&label, &spinBox);

int result = dialog.exec();

if (result == QDialog::Accepted) {
  int age = spinBox.value();
  std::cout << "あなたの年齢は" << age << "歳です。" << std::endl;
} else {
  std::cout << "キャンセルされました。" << std::endl;
}

カスタムダイアログ

  • 欠点
    • コードが最も複雑になる
    • レイアウトや機能の追加に時間と労力がかかる
  • 利点
    • 完全にカスタマイズ可能な入力フォームを作成できる

サードパーティライブラリ

  • 欠点
    • ライブラリのインストールと設定が必要になる
  • 利点
    • 入力検証やデータ変換などの機能を拡張できる

QInputDialog::intValue は、シンプルな整数値入力ダイアログを表示するのに適していますが、より複雑な要件や柔軟性を必要とする場合は、代替手段を検討することをお勧めします。