Qt5再入門: Qt DesignerでNotes C APIコンバートシミュレーターダイアログを作る(その4/QCheckBox)
今回は、Qtウィジェットのチェックボックスについて紹介します。
チェックボックスの設定
前回までに作成しているダイアログをQt Designerで開きます。左側にあるウィジェットペインの、「Buttons」カテゴリーに「Check Box」があるのがわかります。
これをドラッグして、ダイアログ上に持ってきてドロップします。
ドロップしたチェックボックスは、右上のオブジェクトインスペクタペインにも追加されています。変数名として「checkBox」、クラス名として「QCheckBox」となっています。
また、ドロップしたチェックボックスがフォーカスされているので、右下のプロパティエディタペインにはこのチェックボックスの状態が表示されています。初期状態では、QObjectカテゴリーのobjectName(変数名)プロパティが「checkBox」、QAbstractButtonカテゴリーのtextプロパティが「CheckBox」となっています。このテキストは、エディタ上のチェックボックスの右側にあるテキストとして表示されているものです。
ここでチェックボックスをチェック状態にしてみます。
QAbstractButtonカテゴリー内の「checked」プロパティのボックスをクリックして、チェックしてみると、エディタ上のチェックボックスもチェックされた状態になります。
初期状態から変更を加えたプロパティは、プロパティ名の部分が太字になります。また、値の欄には右端に赤い戻り矢印ボタンが表示されます。これは、初期状態に戻してくれるボタンです。クリックしてチェックされていない状態に戻しておきます。
ここで変数名(QObject::objectName)と表示テキスト(QAbstractButton::text)を、それぞれ「isCurrencyCheckbox」と「Currency」しておきます。
上記状態で保存して、Qt Designerを閉じます。
コーディング
Qt Creatorに戻り、ConvertSimulatorDialogのヘッダーファイルを開きます。
ConvertSimulatorDialogクラスの宣言に、以下のスロットメソッドを追加します。
// convertsimulatordialog.h
// ...
public slots:
void toggleIsCurrency(bool value);
// ...
ConvertSimulatorDialogのソースファイルを開き、このスロットメソッドの実装をコーディングします。今回は、QMessageBox::informationを使って、チェック状態を表示させてみます。
// convertsimulatordialog.cpp
#include <QMessageBox>
// ...
void ConvertSimulatorDialog::toggleIsCurrency(bool value) {
QMessageBox::information(
this,
"Chechbox state",
tr("Currency box is %1.").arg(value ? "checked" : "not checked")
);
}
// ...
なお、ここで「tr(...).arg(...)」という表記があります。この表記になじみがない方は、ここでは「printfの書式指定子のようなもの」と思ってください。
さらにConvertSimulatorDialogのコンストラクタ内に、さきほどのチェックボックスがチェックを繰り返すたびに送信されるシグナル「toggled」と、このスロットメソッドを接続するようにコーディングします。
// convertsimulatordialog.cpp
// ...
connect(
ui->isCurrencyCheckbox, &QCheckBox::toggled,
this, &ConvertSimulatorDialog::toggleIsCurrency);
// ...
デバッグ実行
では、ここまでの動きを試してみましょう。Qt Creatorでこのアプリをデバッグモードで起動し、メニューの「Tools」→ 「Convert Simulator」でダイアログを開きます。
チェックボックスにチェックを入れてみると、ダイアログが表示され、ブール値trueが送信されたことがわかります。
再度クリックしてチェックを外すと、ブール値falseが送信されたことがわかるダイアログが表示されます。
まとめ
このように見ていくと、ユーザーの意思(チェックを付けたい、外したい)をプログラムが受け取るまでの構築プロセスが、Webアプリケーションを作っているのではと思えるくらい洗練されていると、私は常に思っています。C++でのコーディングスタイルを守りつつ、Qtのmoc(Meta-Object Compiler)が裏でソースコードを生成することで、開発者が極力煩雑な作業をしなくて済むようにしてくれている結果だと思います。
Qtはこの「GUI開発の省力化」の次世代として、「Qt Quick」を投入しています。私自身は、よくQt Creatorが落ちたり、コードスタイルになかなかなじまなかったり、部品がまだまだ不足していたりであまり使えていませんが、Qt 自体がバージョン6になり、Qt Quick自体もどんどん進化しているので、いずれQt Quickでの開発に移行していくのでしょう。