見出し画像

Qt5再入門: Qt DesignerでNotes C APIコンバートシミュレーターダイアログを作る(その5/QRadioButton)

今回は、Qtウィジェットのラジオボタンについて紹介します。

ラジオボタンの設定

前回同様、ダイアログをQt Designerで開きます(チェックボックスはいったん削除してあります)。左側にあるウィジェットペインの、「Buttons」カテゴリーに「Radio Button」があるのがわかります。

スクリーンショット 2021-09-09 7.44.44

これをドラッグして、ダイアログ上に持ってきてドロップします。

スクリーンショット 2021-09-09 8.01.33

通常、ラジオボタンはN者択一で使用されるので、ここでは3つ配置したいと思います。

スクリーンショット 2021-09-09 8.02.53

ラジオボタンのobjectNameとtextの値を設定していきます。一番上のラジオボタンを選択し、プロパティエディタのobjectName欄をクリックすると、編集できます。

スクリーンショット 2021-09-09 8.03.54

一番上のラジオボタンは、objectNameをtextRadio、textをTextとしてみました。

スクリーンショット 2021-09-09 8.05.22

2番目はnumberRadio,Number、3番目はdateTimeRadio,Date/Timeとしました。

スクリーンショット 2021-09-09 8.07.03

次に、マウスで範囲選択し、3つのラジオボタンを選択状態にします。

スクリーンショット 2021-09-09 8.08.06

選択されているいずれかのラジオボタン上で右クリックし、コンテキストメニューを開きます。メニューから「ボタングループに割り当て」→「新しいボタングループ」を選択します。

スクリーンショット 2021-09-09 8.09.18

エディタ上は変化がありませんが、オブジェクトインスペクタ上に、QButtonGroupクラスのオブジェクトが追加されたのが確認できます。

スクリーンショット 2021-09-09 8.09.54

これにより、3つのラジオボタンの選択状態が排他的に連動し、いずれかを選ぶと選択状態のボタンが非選択状態になります。

ここでは、QButtonGroupのobjectNameを「dataTypeButtons」としておきます。

スクリーンショット 2021-09-09 8.11.05

ここまで編集したダイアログデータを保存し、Qt Designerを閉じてQt Creatorに戻ります。

コーディング

convertsimulatordialog.hヘッダーファイルを開き、ConvertSimulatorDialogクラスに新しいスロット関数を追加します。

// convertsimulatordialog.h
// クラス定義内
public slots:
 void selectType(QAbstractButton *button);

QAbstractButtonクラスは、QRadioButtonの継承元クラスです。

次に、covertsimulatordialog.cppソースファイルを開き、さきほどのスロット関数を実装します。
内容は、引数のボタンのテキストデータをダイアログに表示するだけのシンプルなものです。

// convertsimulatordialog.cpp
// ...
void ConvertSimulatorDialog::selectType(QAbstractButton *button) {
 QString type = button->text();
 QMessageBox::information(
       this,
       "Radio Button state",
       tr("Select type is %1.").arg(type)
       );

}

最後に、ダイアログのコンストラクタ内でQButtonGroupのbuttonClickedとさきほどのスロット関数を接続します。
なお、今回のシグナル/スロット接続には、SIGNAL/SLOTマクロ形式を使った文字列ベースのスタイルで書いています。実は、QButtonGroupのbuttonClickedには、QAbstractButtonクラスのポインタ以外に、int型を送出するオーバーロードが存在します。オーバーロードが存在すると、これまでのファンクタベースでの接続ができません。公式サイトでは、いくつかの回避策がありますが、まあまあめんどいので、素直に「文字列ベースの接続」で実装します。

// convertsimulatordialog.cpp
// コンストラクタ内
connect(
     ui->dataTypeButtons, SIGNAL(buttonClicked(QAbstractButton*)),
     this, SLOT(selectType(QAbstractButton*))
     );

デバッグ実行

では、ここまでの動きを試してみましょう。Qt Creatorでこのアプリをデバッグモードで起動し、メニューの「Tools」→ 「Convert Simulator」でダイアログを開きます。

スクリーンショット 2021-09-09 8.12.31

設定したラジオボタン3つが並んでいます。
ここで「Text」をクリックしてみます。

スクリーンショット 2021-09-09 8.13.02

すると、新たにダイアログが表示され、ラジオボタンのテキストがダイアログメッセージ内にも表示されています。

スクリーンショット 2021-09-09 9.10.51

Numberボタンをクリックすると、Numberが表示されます。

スクリーンショット 2021-09-09 9.11.25

Date/Timeボタンをクリックすると、Date/Timeと表示されました。

スクリーンショット 2021-09-09 9.11.48

まとめ

ラジオボタンの場合、通常の使い方であればQButtonGroupクラスとの併用が一般的になります。QButtonGroupクラスのシグナル、buttonClickedはQAbstractButtonポインタとint型の2つが定義されています。QAbstractButtonポインタの場合、今回はtextメソッドを使いましたが、翻訳関数が絡んでいたり、そもそもテキストを動的に設定したりした場合、textメソッドで取得した値が「どのラジオボタンを選択したか?」を判別できなくなるので、変数名としても使われるobjectNameメソッドで判別する方がよいでしょう。また、ラジオボタンの数が動的だったりすると、objectNameでの判断もままならなくなります。その場合、QList型で管理しているデータと連動しているのであれば、int型で返してくるオーバーロードシグナルを検討できるでしょう。

この記事が気に入ったらサポートをしてみませんか?