目次
Qt4
クロスプラットフォームのアプリケーション・ユーザインタフェースの開発フレームワーク。
現在は Qt Software(旧トロールテック。フィンランドNokia傘下)が LGPL で公開している。商用ライセンスもある。
Qt Creatorという統合開発環境が用意されている。
- http://qt.nokia.com/qt-in-use-jp Qtの導入事例
- 文献 Qt と OpenGL : http://akita-nct.jp/yamamoto/comp/Qt/index.html
- 文献 Qt と WebKit : http://gihyo.jp/dev/feature/01/qt
- http://qtprogramming.s2.zmx.jp/index.html Qt Programming
- http://qt-labs.jp/getting-started-with-qt Qt をはじめよう!
Ubuntu Linux における開発
since 2009-09-01
Ubuntu 9.04 にて。
$ sudo apt-get install qt4-dev-tools
とりあえず何も考えずにいじってみる。
$ mkdir qtapp $ cd qtapp/
ためしに qmake -project してみる。
$ qmake-qt4 -project $ ls qtapp.pro $ qmake-qt4 $ ls Makefile qtapp.pro
make しても何も起こらない。
qtapp.pro を自動生成させる
方針を変えて、まず cpp を作ってみる。
// window_only.cpp #include <qapplication.h> #include <qwidget.h> int main(int argc, char **argv){ QApplication window(argc, argv); QWidget *mainwindow = new QWidget; mainwindow->show(); return window.exec(); }
サンプルは http://akita-nct.jp/yamamoto/comp/Qt/ver3/basic/Qt.php のものだが、setMainWidget を削る必要があった。 http://blog.livedoor.jp/kazz_one/archives/cat_50008592.html を参考にした。
$ cd qtapp $ rm * $ emacs window_only.cpp $ qmake -project // これで qtapp.pro が生成される $ qmake // これで Makefile が生成される $ make // これで myapp が生成される $ ./myapp // ウィンドウが表示される
やっと成功した。
今度は setCaption を試すが、Qt4 では setWindowTitle になった模様。
// window_only.cpp #include <qapplication.h> #include <qwidget.h> int main(int argc, char **argv){ QApplication window(argc, argv); QWidget *mainwindow = new QWidget; mainwindow->setWindowTitle("hello Qt"); mainwindow->show(); return window.exec(); }
- qmake のチュートリアル http://qt.nokia.com/doc/4.5/qmake-tutorial.html
- かつては tmake が使われていた
QGLWidget のサブクラスを作る
OpenGL アプリを作る。サンプルは http://akita-nct.jp/yamamoto/comp/Qt/index.html から拝借したが、クラス名を MyWidget にした。
// my_widget.h #include <QtOpenGL> class MyWidget : public QGLWidget { Q_OBJECT public: MyWidget(QWidget *parent = 0); protected: void initializeGL(); void paintGL(); };
// my_widget.cpp #include "my_widget.h" MyWidget::MyWidget(QWidget *parent) : QGLWidget(parent) { } void MyWidget::initializeGL() { glClearColor(1.0, 1.0, 1.0, 1.0); } void MyWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT); glColor3d(1.0, 0.0, 0.0); glBegin(GL_LINE_STRIP); glVertex2d(0.2, 0.1); glVertex2d(0.4, 0.8); glVertex2d(0.8, 0.5); glEnd(); }
コンストラクタにくっついているのは「初期化子(イニシャライザ)」で、 ここでは基底クラスQGLWidgetの初期化が行われている。
// window_only.cpp #include <qapplication.h> #include "my_widget.h" int main(int argc, char **argv){ QApplication app(argc, argv); MyWidget *w = new MyWidget(); w->show(); return app.exec(); }
ここまでファイルを揃えて、qmake -project を実行。
qtapp.pro の最終行に "QT += opengl" を追加。
TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += my_widget.h SOURCES += my_widget.cpp window_only.cpp QT += opengl
そして qmake ; make する。
moc に関する考察
この分割コンパイルの手順を守らないと、はまる。 例えば全部の処理を window_only.cpp に書くと、 C++ 的に正しいはずなのだが、コンパイル(正確にはリンク)エラーになる。
my_widget.cpp:(.text+0xf1): undefined reference to `vtable for MyWidget'
どうやら Q_OBJECT マクロを適切に処理するために moc というツールが実行されるらしい。 ファイルを分割して、qmake で Makefile を自動生成することにより、 make の際に moc_my_widget.cpp というソースが自動生成されるのだ。
/**************************************************************************** ** Meta object code from reading C++ file 'my_widget.h' ** ** Created: Wed Sep 2 17:12:21 2009 ** by: The Qt Meta Object Compiler version 61 (Qt 4.5.0) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ #include "my_widget.h" #if !defined(Q_MOC_OUTPUT_REVISION) #error "The header file 'my_widget.h' doesn't include <QObject>." #elif Q_MOC_OUTPUT_REVISION != 61 #error "This file was generated using the moc from 4.5.0. It" #error "cannot be used with the include files from this version of Qt." #error "(The moc has changed too much.)" #endif 以下略
- moc とは「メタオブジェクトコンパイラ」のこと。
-
- 「ここで Q_OBJECT マクロはプリプロセッサによって mocで実装されるいくつかのメンバ関数の宣言に展開されます」
今後の予定:特に GLUT の代替としてOpenGLベースのアプリケーション開発を試していく予定。
Qt SDK 2010.05 Windows
2010-11-12
Qt4.7 LGPL for Windows
http://qt.nokia.com/downloads/sdk-windows-cpp
から qt-sdk-win-opensource-2010.05.exe (321MB) を落としてみた。
Windows XP SP3 でインストール実行。おそらく3GB以上のディスクの空きが必要。
デフォルトのインストール先は C:\Qt\2010.05 だが、 これを選ぶ時点で 1.7GB くらいのディスク空き容量になっている。
mingw などを入れているようだ。
インストール完了するとすぐに Creator が起動する。
スタートメニューには Qt Command Prompt もある。下記のように表示される。
Setting up a MinGW/Qt only environment... -- QTDIR set to C:\Qt\2010.05\qt -- PATH set to C:\Qt\2010.05\qt\bin -- Adding C:\Qt\2010.05\bin to PATH -- Adding C:\WINDOWS\System32 to PATH -- QMAKESPEC set to win32-g++ C:\Qt\2010.05\qt>
mingw 版の gcc が入っている。
C:\Qt\2010.05\qt>gcc -v Using built-in specs. Target: mingw32 Configured with: ../gcc-4.4.0/configure --enable-languages=c,ada,c++,fortran,jav a,objc,obj-c++ --disable-sjlj-exceptions --enable-shared --enable-libgcj --enabl e-libgomp --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enab le-version-specific-runtime-libs --prefix=/mingw --with-gmp=/mingw/src/gmp/root --with-mpfr=/mingw/src/mpfr/root --build=mingw32 Thread model: win32 gcc version 4.4.0 (GCC)
セットアップファイルを消して、ゴミ箱を空にすると、約2GB ハードディスクが空いた。よかった。。。
サンプルを実行
Creater 初期画面にて
「QtのC++のサンプルを参照する」→「サンプルプログラムを選ぶ」→ "Multimedia"
"Audio Input" というサンプルを見つけた。
ビルドして実行したら下記のようにマイク音量レベルが赤く動く。
実行ファイルは C:\Qt\2010.05\qt\examples\multimedia\audioinput\release にできている。
実行ファイルのDLL依存性
上記の実行ファイルをエクスプローラでダブルクリックすると
「audioinput.exe - コンポーネントが見つかりません」
「libgcc_s_dw2-1.dllが見つからなかったため、このアプリケーションを開始できませんでした。 アプリケーションをインストールし直すとこの問題は解決される場合があります。
というダイアログ。
http://yaman256.blog47.fc2.com/blog-entry-1192.html DLLを一緒に配る必要があるらしい。 あるいは static 版を自分でビルドする必要。
バージョン管理
いまどきの RAD 環境っぽく Creator から mercurial と git が使える。
mercurial-1.7.0.msi を http://mercurial.selenic.com/wiki/Download からインストールしておく。
メニューにはないが設定ダイアログによると Subversion, CVS, Perforce に対応。
プロジェクトを作る
GUIアプリを作ってみる。フォームが出てくるので PushButton と TextEdit を乗せてみる。
PushButton で右クリック "Go to slot…" → clicked() を選ぶ。
void MainWindow::on_pushButton_clicked() { ui->textEdit->setText("hello"); }
これで実行。コンパイルは少し待たされる。
ボタンを押すとテキストボックスに文字が出る。
Mac (Snow Leopard)
QML
since 2010-11-14
Qt 4.7 に入っているのは Creator 2.0.1 なので、別途ベータ版を入手する必要がある。
http://builder.japan.zdnet.com/news/story/0,3800079086,20414100-2,00.htm
QMLスクリプト言語
- http://qt-labs.jp/2010/11/11/qt-creator-2-1-beta-2.html Qt Creator 2.1 ベータ2
<html> <div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311344X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51fYkkbMiiL._SL160_.jpg" alt="入門 Qt 4 プログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311344X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">入門 Qt 4 プログラミング</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/487311344X/r4wh-22/ref=nosim/" title="入門 Qt 4 プログラミング" target="_blank">amazlet</a> at 10.11.14</div></div><div class="amazlet-detail">Jasmin Blanchette Mark Summerfield <br />オライリー・ジャパン <br />売り上げランキング: 110117<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311344X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div> </html>