Qt Widgets: ラジオボタングループの操作をさらに便利に!QButtonGroup::checkedButton() でチェック済みボタンを効率的に取得


QButtonGroup::checkedButton() は、QButtonGroup に属するチェックされたボタンを取得するためのメソッドです。このメソッドは、ボタングループ内のどのボタンが現在アクティブになっているかを判断する際に役立ちます。

メソッドの構成

QAbstractButton* QButtonGroup::checkedButton() const;

このメソッドは、QAbstractButton ポインタを返します。これは、現在チェックされているボタンを表します。もしボタングループ内にチェックされたボタンが存在しない場合は、nullptr が返されます。

メソッドの動作

checkedButton() メソッドは、ボタングループ内のすべてのボタンを調べ、現在チェックされているボタンを見つけます。見つかれば、そのボタンへのポインタを返します。もしチェックされたボタンが存在しない場合は、nullptr を返します。

メソッドの例

QButtonGroup buttonGroup;
QRadioButton* radioButton1 = new QRadioButton("Option 1");
QRadioButton* radioButton2 = new QRadioButton("Option 2");

buttonGroup.addButton(radioButton1);
buttonGroup.addButton(radioButton2);

radioButton2->setChecked(true);

QAbstractButton* checkedButton = buttonGroup.checkedButton();

if (checkedButton) {
  qDebug() << "Checked button text:" << checkedButton->text();
} else {
  qDebug() << "No button is checked";
}

この例では、radioButton2 がチェックされているため、checkedButton 変数には radioButton2 へのポインタが格納されます。

  • ボタングループ内のボタンがクリックされたときに通知を受けるには、buttonClicked() シグナルに接続します。
  • ボタングループ内のボタンのチェック状態を変更するには、setChecked() メソッドを使用します。
  • checkedButton() メソッドは、ボタングループ内のどのボタンがチェックされているかを判断するだけでなく、そのボタンにアクセスするのにも使用できます。


#include <QApplication>
#include <QButtonGroup>
#include <QRadioButton>

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

  // ラジオボタンを作成
  QRadioButton* radioButton1 = new QRadioButton("Option 1");
  QRadioButton* radioButton2 = new QRadioButton("Option 2");
  QRadioButton* radioButton3 = new QRadioButton("Option 3");

  // ボタングループを作成
  QButtonGroup buttonGroup;

  // ラジオボタンをボタングループに追加
  buttonGroup.addButton(radioButton1);
  buttonGroup.addButton(radioButton2);
  buttonGroup.addButton(radioButton3);

  // 2 番目のボタンをデフォルトで選択
  radioButton2->setChecked(true);

  // ボタングループ内のボタンがクリックされたときにシグナルを接続
  connect(buttonGroup, &QButtonGroup::buttonClicked, [=](QAbstractButton* button) {
    qDebug() << "Clicked button text:" << button->text();
  });

  // ウィジェットを表示
  radioButton1->show();
  radioButton2->show();
  radioButton3->show();

  return app.exec();
}


独自のロジックを使用する

最も単純な代替方法は、独自のロジックを使用してボタングループ内のチェックされたボタンを特定することです。これは、次のような場合に役立ちます。

  • チェックされたボタンのみに基づいて特定のアクションを実行する必要がある場合
  • ボタングループ内にチェックされたボタンが 1 つだけであることがわかっている場合

この方法の利点は、シンプルでわかりやすいことです。一方、欠点は、すべてのボタンをループ処理する必要があるため、ボタンの数が多い場合は非効率になる可能性があることです。

bool hasCheckedButton = false;
QAbstractButton* checkedButton = nullptr;

for (QAbstractButton* button : buttonGroup.buttons()) {
  if (button->isChecked()) {
    hasCheckedButton = true;
    checkedButton = button;
    break;
  }
}

if (hasCheckedButton) {
  // チェックされたボタンに基づいてアクションを実行
  qDebug() << "Checked button text:" << checkedButton->text();
} else {
  // チェックされたボタンがない
  qDebug() << "No button is checked";
}

QList::indexOf() を使用する

ボタングループ内のチェックされたボタンを特定するもう 1 つの方法は、QList::indexOf() メソッドを使用することです。この方法は、次のような場合に役立ちます。

  • チェックされたボタンのインデックスに基づいて特定のアクションを実行する必要がある場合
  • チェックされたボタンが 1 つだけであることがわかっている場合

この方法の利点は、QButtonGroup::buttons() メソッドよりも効率的であることです。一方、欠点は、チェックされたボタンが 1 つ以上存在する場合に正しく動作しない可能性があることです。

QAbstractButton* checkedButton = buttonGroup.buttons().indexOf(buttonGroup.checkedButton());

if (checkedButton) {
  // チェックされたボタンに基づいてアクションを実行
  qDebug() << "Checked button text:" << checkedButton->text();
} else {
  // チェックされたボタンがない
  qDebug() << "No button is checked";
}

lambda 式を使用する

QButtonGroup::find() メソッドを使用して、チェックされたボタンを特定することもできます。この方法は、次のような場合に役立ちます。

  • チェックされたボタンに基づいて複雑なアクションを実行する必要がある場合
  • チェックされたボタンに特定の条件を満たす必要がある場合

この方法の利点は、柔軟性が高いことです。一方、欠点は、理解しにくく、コードが冗長になる可能性があることです。

QAbstractButton* checkedButton = buttonGroup.find([=](QAbstractButton* button) {
  return button->isChecked();
});

if (checkedButton) {
  // チェックされたボタンに基づいてアクションを実行
  qDebug() << "Checked button text:" << checkedButton->text();
} else {
  // チェックされたボタンがない
  qDebug() << "No button is checked";
}