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();
}

あとは、ビルド実行してみる。
エラーなく実行できたら、ダイアログをいじって、使用上問題ないか確かめる。