Qtプログラミング – ダイアログ
津路です。
前回は、Qtで特徴的な、シグナルとスロットについて取り上げました。
これからは、Jasmin Blanchette、Mark Summerfield著 「Qt4プログラミング」 から抜粋します。
スロットは、通常のC++メンバー関数と同様で、virtual, overload, public, protected, private いずれにも指定できて、普通関数みたいに呼び出すこともできます。
シグナルが起きるとスロットが呼び出されます。
connect(sender, SIGNAL(signal), receiver, SLOT(slot function));
sender, receiverはQObjectへのポインタで、signal, slot functionは、関数宣言から引数を省略したものです。
さて、書籍の次の項目で、「ダイアログのRADデザイン」という項目があります。
要するに、プログラミングのみにてGUIを作成するのでなく、Qt Designerを使って、コンポーネントを配置してダイアログを作成することです。
Qtで便利なのは、GUIをdesignerで作成したあと、qmakeというコマンドで、.uiリソースファイルから、makeルールを作成します。
これにより、ui_???.h が出力されます。
ここでは、Ui::??? ???はクラス名の宣言が行われます。
また、各QWidgetの変数と、setupUiという便利な関数が宣言されます。
重要なのは、生成されたクラスは、Qtクラスを継承していない?ことです。
インスタンスを生成して使うには、main.cppにて、以下のようにコーディングします。
1 2 3 4 5 6 7 8 9 | int main(int argc, char*argv[]) { QApplication app(argc,argv); Ui::TestDialog ui; QDialog *dialog = new QDialog; ui.setupUi(dialog); dialog->show(); return app.exec(); } |
さて、これだけでは、イベントに何も反応しない、うすっぺらなUIプログラムです。
シグナルとスロットを使うには、QDialogと、designerでできたuiプログラムのクラスを、多重継承したクラスを新たに宣言することです。
以下のような形ですね。
1 2 3 4 5 6 7 8 | class TestDialog : public QDialog, private Ui::TestDialog { Q_OBJECT public: TestDialog(QWidget *parent = 0); private slots: void on_Text_Changed(); }; |
Ui::TestDialogが、uicで作成されたクラスです。
TestDialogクラスは、親QWidgetポインタを必要とします。
slotには、シグナルに反応する関数を宣言します。