Qt による GUI アプリケーションの作成
Qt とは、クロスプラットフォームな C++ ツールキットです。Google Earth や Opera、KDE などで利用されています。このページでは、Qt Designer を用いた、GUI アプリケーションの作成方法について簡単にまとめてみました。
ここで扱っているのは、Qt 4.1 です。Qt 3 と Qt 4 とはソース互換性がないため、Qt 3 のコードはそのままでは使えません。qt3to4 や uic3 などのツールはあるものの制約があり、どうしても手動で Qt 4 用にコードを書き直す部分が出てきます。(参考:Porting to Qt 4)
このページでは、背景色が黒い部分はコマンドラインからの入力を意味します。また、各入力に対する説明を下に書き、各段階で存在するファイルを列挙しました。
まず、Qt Designer で ui ファイルを作成します。ここでは、ウィンドウに QTextEdit を乗せてテキストエディタもどきを作りました。なお、Qt Designer 4 ではプロジェクトマネージャやコードエディッタ機能が削除されています。(参考:Qt Designer Manual、Porting .ui Files to Qt 4)
ここでは、notepad.ui という ui ファイルを作成しました。
- notepad.ui
作成した ui ファイルを保存したディレクトリにカレントディレクトリを移動し、上の uic コマンドを実行します。これにより、ui ファイルから C++ のコードが生成されます。-o オプションでは出力するファイル名を指定します。(参考:User Interface Compiler (uic))
- notepad.h
- notepad.ui
main.cpp、mainwindow.h、mainwindow.cpp を作成します。これらのファイルを一つのファイルにまとめてしまうと、コンパイル出来なくなります。(参考:The Single Inheritance Approach)
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "notepad.h"
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
private:
Ui::MainWindow ui;
};
#endif
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
ui.setupUi(this);
}
- main.cpp
- mainwindow.cpp
- mainwindow.h
- notepad.h
- notepad.ui
これにより、pro ファイルが生成されます。ファイル名は、main.cpp などを保存したディレクトリ名(以下の例ではeditor)です。QtXml Module を使用する場合は、pro ファイルに Qt += xml を追加する必要があります。他の Module についても同様です。(参考:Syntax、Qt Tutorial 1 - Hello World!、QtXml Module)
- editor.pro
- main.cpp
- mainwindow.cpp
- mainwindow.h
- notepad.h
- notepad.ui
これにより、Makefile が生成されます。
- debug(ディレクトリ)
- editor.pro
- main.cpp
- mainwindow.cpp
- mainwindow.h
- Makefile
- Makefile.Debug
- Makefile.Release
- notepad.h
- notepad.ui
- release(ディレクトリ)
(Windows の場合)make すると、release ディレクトリ内に .exe ファイルが生成されます。なお、make debugするには、デバックライブラリーを予めビルドしておかなければなりません。
- release
- editor.exe
- main.o
- mainwindow.o
- moc_mainwindow.cpp
- moc_mainwindow.o
実行すると、ウィンドウが現れます。
スタティックリンク
以上の方法で作成した実行可能ファイルは、QtCore4.dll などの dll ファイルに依存します。依存しないようにするには Building Qt Statically のように Qt をビルドします。ただ、コンパイラとして MinGW を使用した場合には(mingw32-make)、mingwm10.dll に依存するファイルとなる。Makefile.Release の LFLAGS から -mthreads を削除すれば、依存関係を取り除けます(参考:Dependency on mingwm10.dll)。
なお、実行可能ファイルに必要な dll ファイルは msys か Cygwin があれば、次の方法で調べられます。
objdump -p hoge.exe | grep -i .dllGentoo Linux の場合
make release や make debug が出来ない。引数なしで make すると main.cpp などがあるディレクトリと同じディレクトリに実行ファイルができる。