目次

Qt4

クロスプラットフォームのアプリケーション・ユーザインタフェースの開発フレームワーク。

現在は Qt Software(旧トロールテック。フィンランドNokia傘下)が LGPL で公開している。商用ライセンスもある。

Qt Creatorという統合開発環境が用意されている。

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

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
 
以下略

今後の予定:特に 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 から mercurialgit が使える。

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)

since 2010-11-14

macports から qt4-mac qt4-mac-devel パッケージが使える。かなり時間がかかる。

入れてみたがまだ試していない。

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スクリプト言語

<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>