Qt による GUI アプリケーションの作成

Qt とは、クロスプラットフォームな C++ ツールキットです。Google EarthOperaKDE などで利用されています。このページでは、Qt Designer を用いた、GUI アプリケーションの作成方法について簡単にまとめてみました。

ここで扱っているのは、Qt 4.1 です。Qt 3 と Qt 4 とはソース互換性がないため、Qt 3 のコードはそのままでは使えません。qt3to4uic3 などのツールはあるものの制約があり、どうしても手動で Qt 4 用にコードを書き直す部分が出てきます。(参考:Porting to Qt 4

このページでは、背景色が黒い部分はコマンドラインからの入力を意味します。また、各入力に対する説明を下に書き、各段階で存在するファイルを列挙しました。

まず、Qt Designer で ui ファイルを作成します。ここでは、ウィンドウに QTextEdit を乗せてテキストエディタもどきを作りました。なお、Qt Designer 4 ではプロジェクトマネージャやコードエディッタ機能が削除されています。(参考:Qt Designer ManualPorting .ui Files to Qt 4

New Form
MainWindow - untitled*
Save from as

ここでは、notepad.ui という ui ファイルを作成しました。

uic -o notepad.h notepad.ui

作成した ui ファイルを保存したディレクトリにカレントディレクトリを移動し、上の uic コマンドを実行します。これにより、ui ファイルから C++ のコードが生成されます。-o オプションでは出力するファイル名を指定します。(参考:User Interface Compiler (uic)

main.cpp、mainwindow.h、mainwindow.cpp を作成します。これらのファイルを一つのファイルにまとめてしまうと、コンパイル出来なくなります。(参考:The Single Inheritance Approach

main.cpp

#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}

mainwindow.h

#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

mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    ui.setupUi(this);
}
qmake -project

これにより、pro ファイルが生成されます。ファイル名は、main.cpp などを保存したディレクトリ名(以下の例ではeditor)です。QtXml Module を使用する場合は、pro ファイルに Qt += xml を追加する必要があります。他の Module についても同様です。(参考:SyntaxQt Tutorial 1 - Hello World!QtXml Module

qmake

これにより、Makefile が生成されます。

make release

(Windows の場合)make すると、release ディレクトリ内に .exe ファイルが生成されます。なお、make debugするには、デバックライブラリーを予めビルドしておかなければなりません。

release\editor.exe

実行すると、ウィンドウが現れます。

MainWindow

スタティックリンク

以上の方法で作成した実行可能ファイルは、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 .dll

Gentoo Linux の場合

make releasemake debug が出来ない。引数なしで make すると main.cpp などがあるディレクトリと同じディレクトリに実行ファイルができる。

MainWindow