Dialogの作成まとめ
例)mydialogの作成
プロジェクトを作成
以下をコマンドラインで実行して、
$ mkdir mydialog $ cd mydialog $ touch mydialog.h $ touch mydialog.cpp $ qmake -project $ qmake mydialog.pro
QtDesignerを起動して、ダイアログのパーツとそのオブジェクト名を指定する。
SIGNALやSLOTも設定しておく。
↑moreボタンを押すと下のSecondary Key,Teritiary Keyの表示非表示切りかえを設定したところ。OKやcancelは、本体のオブジェクトの関数を呼ぶように設定されている。これはQt本35ページあたりの例で作ったもの。
ファイルを保存(mydialog.ui)し、ここで一旦qmakeを実行しておく。
$ qmake -project;qmake mydialog.pro
mydialog.hの作成(mydialogクラスの作成)
先程QtDesignerで作成したGUIはmocによってui_mydialog.hが自動的に生成される。そのui_mydialog.hと、継承元のQDialogをincludeする。
なお、QDialogと自動生成されたUi::MyDialogを継承する。QDialogはpublicを、Ui::MyDialogはprivateを指定する。多重継承ってこんなことができるんだねぇ。
1行目の「#ifndef なんちゃら」によって、既に読み込まれていた場合、以下の処理をスキップする。
コンストラクタの第一引数はQWidgetのインスタンスであるが、初期値として0を指定することが可能。0の場合、親ウィンドウのない、単独のアプリということになる。
#ifndef MYDIALOG_H #define MYDIALOG_H #include QDialog #include "ui_mydialog.ui" class MyDialog : public QDialog,private Ui::MyDialog { Q_OBJECT public: MyDialog(QWidget *parent=0); }; #endif
この宣言内に、「private slots:」とすると内部で使用するスロット用の関数宣言になる。とりあえずmydialogで実装される関数の宣言はここで行う。
なお、on_オブジェクト名_シグナル名()というスロット関数を宣言すると、初期化時のsetupUi関数が自動的にシグナルとスロットを接続する。
クラス宣言は、構造体の宣言と同じらしいので、宣言後にはセミコロンを置くことを忘れてはいけない。
mydialog.cppの作成(mydialogクラスの実装)
MyDialogに属する関数なので、「MyDialog::」というプレフィクスを付ける。
コンストラクタにて、親クラスであるQDialogのコンストラクタを呼びだす書き方を行う。さらに、QtDesignerで作成したGUIから自動生成されたsetupUiを自分を引数にして呼び出す。
#include <QtGui> #include "mydialog.h" //コンストラクタ MyDialog::MyDialog(QWidget *parent) : QDialog(parent) { setupUi(this); // 初期設定する } // その他関数定義をここで行う
この時点でビルドしてエラーが出るかどうか確認してもよい。個人的には確認しちゃう。でも、ビルドが結構時間かかるのでめんどくさくなっちゃうかもしれん。
テスト用のプログラムを作成
main.cppを作成する。
#include <QApplication> #include "mydialog.h" int main(int argc,char *argv[]){ QApplication app(argc,argv); MyDialog *dialog = new MyDialog; dialog->show(); return app.exec(); }
あとは、ビルド実行してみる。
エラーなく実行できたら、ダイアログをいじって、使用上問題ないか確かめる。