Raspberry Pi 3 で Qt
津路です。
今回は、昨年進め始めてとん挫していた、Qtプログラミングを再開してみることにしました。
昨年デバッグするときに、どうもおかしいなあと感じていたのですが、今回、debugging symbols for Qt Creatorがないことに気づき、インストールしました。
なんと323MBもあり、1時間半ほどかかりました。
やはり、インストールするときちんとブレークポイントで止まって、変数の中身が正確に見えます。
さて、ダイアログを作成するときにシグナルとスロットを定義します。その際、クラス定義でQ_OBJECT宣言が必要です。
Q_OBJECTはマクロです。
シグナルの宣言は、signals:というマクロの下で宣言します。
スロットの宣言は、slots: というマクロの下で宣言します。
ダイアログの子ウィジェット変数は、ヘッダ側でポインタとして宣言しておきます。
このとき、変数のクラスの前方参照を用いて宣言します。
前方参照とは、一般には前方宣言のことで、無駄なincludeを避けるために、クラス名のみを、作成するクラスのヘッダの先頭で宣言します。ダイアログを利用する場合は、QDialogをincludeします。
そして、cppソース側で、QtGUIをincludeし、クラス生成関数にて、parentパラメータを親クラスのコンストラクタに渡します。以下のように。
xxDialog::xxDialog(QWidget *parent)
: QDialog(parent)
{
}
さて、子ウィジェットを宣言していくわけですが、単に並べていくだけでは、きれいに配置することができません。
QLayoutというレイアウトマネージャーを使えば、領域ごとにウィジェットを配置して、整理できて便利です。
QHBoxLayout内では、横方向に、QVBoxLayout内では、縦方向に並べます。
QLayoutは、階層化できます。階層化するには、addLayout関数を使います。
さて、QWidgetやQHBoxLayoutなどを作成するには、new 演算子を使いますが、Qtでは deleteが不要です。
Qtは、親が破棄されるときに、子オブジェクトを破棄します。
ここで、話はスロットに行きます。
スロットでは、シグナルを通じて呼び出された際に、それに対するアクションを定義していきます。
例えば、あるボタンが押されたら、ファイルを読み込むとかですね。
通常は、connect関数で、シグナルとスロットを結びつけます。
詳しくは、次回に。。