【保存版】Qt Widgets ボタングループの操作方法:QButtonGroup::button() 関数の使い方をわかりやすく解説


QButtonGroup::button() 関数は、指定された ID に基づいて QButtonGroup 内のボタンを取得するために使用されます。この関数は、ボタン グループ内の特定のボタンにアクセスしたり、そのボタンの状態を操作したりする際に役立ちます。

構文

QAbstractButton *QButtonGroup::button(int id) const;

パラメータ

  • id: 取得したいボタンの ID を指定します。

戻り値

  • 一致するボタンが見つからない場合は、nullptr が返されます。
  • 指定された ID に一致するボタンが見つかった場合、そのボタンへのポインタが返されます。
QButtonGroup group;
QPushButton *button1 = new QPushButton("Option 1");
QPushButton *button2 = new QPushButton("Option 2");

group.addButton(button1, 1);
group.addButton(button2, 2);

// ボタン 1 を取得
QAbstractButton *button = group.button(1);
if (button) {
    // ボタン 1 の状態を確認
    if (button->isChecked()) {
        // ボタン 1 が選択されている
    } else {
        // ボタン 1 が選択されていない
    }
} else {
    // ボタン 1 が見つかりませんでした
}
  • ボタン グループ内のボタンの状態を設定するには、setChecked() メソッドを使用できます。
  • ボタン グループ内のボタンの状態を取得するには、isChecked() メソッドを使用できます。
  • ボタンの ID は、QButtonGroup::addButton() 関数を使用して設定できます。


import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QRadioButton, QButtonGroup

class Example(QWidget):

    def __init__(self):
        super().__init__()

        # ボタン グループを作成
        self.button_group = QButtonGroup()

        # ラジオボタンを作成
        self.radio_button1 = QRadioButton("Option 1")
        self.radio_button2 = QRadioButton("Option 2")
        self.radio_button3 = QRadioButton("Option 3")

        # ラジオボタンをボタン グループに追加
        self.button_group.addButton(self.radio_button1, 1)
        self.button_group.addButton(self.radio_button2, 2)
        self.button_group.addButton(self.radio_button3, 3)

        # ラジオボタンのクリックイベントに接続
        self.radio_button1.clicked.connect(self.on_radio_button_clicked)
        self.radio_button2.clicked.connect(self.on_radio_button_clicked)
        self.radio_button3.clicked.connect(self.on_radio_button_clicked)

        # ラジオボタンをレイアウトに追加
        layout = QVBoxLayout()
        layout.addWidget(self.radio_button1)
        layout.addWidget(self.radio_button2)
        layout.addWidget(self.radio_button3)
        self.setLayout(layout)

    def on_radio_button_clicked(self):
        # クリックされたラジオボタンを取得
        selected_button = self.button_group.button(self.button_group.checkedId())

        # ラジオボタンのラベルを取得
        text = selected_button.text()

        # メッセージを出力
        print(f"{text} が選択されました")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec())

このコードを実行すると、以下のようになります。

  1. 3 つのラジオボタンが表示されます。
  2. いずれかのラジオボタンをクリックすると、そのラジオボタンのラベルがコンソールに出力されます。


代替方法

  • ループを使用してボタンを反復処理する

    ボタン グループ内のすべてのボタンを反復処理するには、ループを使用できます。この方法では、ボタンの ID を知らなくても、目的のボタンを見つけることができます。

    for (QAbstractButton *button : group.buttons()) {
        if (button->text() == "Option 1") {
            // ボタン 1 を見つけました
        }
    }
    

    このコードは、Option 1 というラベルを持つボタン グループ内のボタンを検索します。

  • findChild() 関数を使用する

    findChild() 関数は、ウィジェット ツリー内の特定の子ウィジェットを検索するために使用できます。この関数は、ボタン グループ内のボタンを検索するために使用できますが、QButtonGroup::button() 関数よりも汎用性が高く、ボタン グループ以外のウィジェットを検索するのにも使用できます。

    QAbstractButton *button = group.findChild<QAbstractButton*>(QString("option1"));
    

    このコードは、option1 という名前のボタン グループ内のボタンを検索します。

  • ループを使用してボタンを反復処理する方法は、ボタンの名前がわからない場合や、ボタン グループ内のすべてのボタンに処理を実行する必要がある場合に適しています。
  • findChild() 関数は、ボタンの名前がわかっている場合は、より簡潔な方法です。
  • 代替方法を使用する場合は、ボタンが見つからない可能性を考慮する必要があります。
  • QButtonGroup::button() 関数は、ボタン グループ内のボタンが確実に存在することを前提としています。ボタンが存在しない場合は、この関数は nullptr を返します。