| ホーム · 全てのクラス · 主要なクラス · 注釈付きクラス一覧 · グループ別クラス · 関数一覧 |
[次: Tulip Container クラス]
このドキュメントは Qt 3 と Qt 4 の最も重要な違いをカバーしています。これは包括的なポーティングガイドを意図しているものではなく、あなたが遭遇するであろう最も重要な移植性に関して述べています。また、Qt3からの互換性サポートについて説明します。
Qt 4 では以下のコアテクノロジーが導入されています:
Qt 4 は新しいユーザーインターフェースデザインツールの Qt Designer も含みます。 Qt Designer overview を見てください。
さらに、Qt 3 より以下のモジュールがかなり改良されました :
以前のQtのリリースとは違い、 Qt 4 は似たようなライブラリの集まりです :
| ライブラリ | 説明 |
|---|---|
| QtCore | 非GUIのコア機能 |
| QtGui | GUIのコア機能 |
| QtNetwork | Networkモジュール |
| QtOpenGL | OpenGLモジュール |
| QtSql | SQLモジュール |
| QtXml | XMLモジュール |
| Qt3Support | Qt3サポートクラス |
| QAxContainer | ActiveQt クライアント拡張 |
| QAxServer | ActiveQt サーバ拡張 |
| QtDesigner | Qt Designerを拡張したり組み込んだりするためのクラス |
QtCore は QString, QList, や QFileのようなツールクラスを QObject や QTimerのようなカーネルクラスと同様に含みます。 QApplication クラスはリファクタリングされ、非GUIアプリケーションにも用いることができるようになりました。このクラスは QCoreApplication (in QtCore) そして QApplication (in QtGui)に分割されました。
このように分割することによって、不必要なGUI関連のコードとのリンクすることのない、そしてターゲットマシンにGUI関連のライブラリがインストールされている必要のない、Qtを利用したサーバアプリケーションを開発することが可能になりました。(e.g Xlib on X11, Carbon on Mac OS X).
makefike を生成するのに qmake を利用する場合、 qmake のデフォルト動作ではアプリケーションを QtCore ではなく QtGuiにリンクするようになっている QtGuiに対するこの依存関係を取り除くには、.pro ファイルに
QT -= gui
と書き入れること. ほかのライブラリを有効にするには、行を追加することでおこなう.
QT += network opengl sql qt3support
ビルドシステムに加えられた他の変更点としては、moc がプリプロセッサの指令を理解するようになったことが挙げられる。moc には C++ プリプロセッサが内蔵され、qmake はプロジェクトに対する定義セット ("DEFINES +=" による) を moc へ自動的に渡すようになった。
.ui ファイルを使ったコードをコンパイルするには、.pro ファイルに以下の行が必要となる:
CONFIG += uic3
Qt のクラス定義をインクルードする構文は以下のようになった.
#include <QClassName>
例:
#include <QString>
#include <QApplication>
#include <QSqlTableModel>
これは公開されている全ての Qt クラスで動作することが保証されている. 古い文法の
#include <qclassname.h>
も継続して利用できるが、新しい文法への移行が推奨される.
アプリケーションにリンクされないライブラリのヘッダファイルをインクルードしようとした場合、コンパイル時にワーニング (たとえばQSqlQueryNo such file or directory") が出る. この問題はインクルードを取り除くか、見つからないライブラリを .pro ファイルの QT エントリに加えることで回避できる. (上記の Build System を見よ)
ライブラリの名前を単純に記述することで、ライブラリに含まれる全てのクラス定義をインクルードすることができる. 例:
#include <QtCore>
Qt 2 では、グローバル定数のために Qt という名前のクラス (たとえば Qt::yellow) が導入された. Qt 2 がリリースされた当時には C++ の名前空間を扱えないコンパイラもあったので、名前空間の導入は見送られていた.
Qt 4 では、この Qt クラスは 名前空間 Qt に取って代えられる. 名前空間 Qt 内にある定数にアクセスするには、プレフィクス Qt::をつける: (たとえば、 Qt::yellowとする) か、
using namespace Qt;
という指令をソースファイルの先頭、 #include 指令の後に追加すること. using namespace を使った場合、プレフィクスは必要なくなる.(たとえば、 yellow で十分である)
Qt 3 アプリケーションを移植する場合、これに関連したソースコードの互換性問題に遭遇するおそれがある. たとえば、Qt 3 ではたとえば、Qt 3 では QWidget::yellow の代わりに Qt::yellowと書くことができた. しかし QWidget -これはQTから継承されていて、Qt4では動かない。そのため Qt::yellow と書きなおすか、あるいは"using namespace" 指令を追加して Qt:プレフィクスを取り除くかしなければならない.
この qt3to4 ポーティング・ツール は、この変換を自動化します。
Qt4で、私たちは QObject/QWidget サブクラスのコンストラクタを簡素化しようとしました。 これは、サブクラス化をより簡単にして、それと同時にQtライブラリをより効率的にするのを助けます。
コンストラクタは「const char *name」を引数に取らなくなりました。もし、貴方が名前を QObjectに付けたければ、貴方は、 QObject::setObjectName(const QString & name)メソッドをインスタンス化の後に実行しなければなりません。オブジェクトの名前は QStringになりました。
QWidget's WFlags data type has been split in two: Qt::WindowFlags specifies low-level window flags (the type of window and the frame style), whereas Qt::WidgetAttribute specifies various higher-level attributes about the widget (e.g., WA_StaticContents). Widget attributes can be set at any time using QWidget::setAttribute(); low-level window flags can be passed to the QWidget constructor or set later using QWidget::setParent(). As a consequence, the constructors of most QWidget subclasses don't need to provide a WFlags parameter.
The parent parameter of all QObject classes in Qt defaults to a null pointer, as it used to do in Qt 1. This enables a style of programming where widgets are created without parents and then inserted in a layout, at which point the layout automatically reparents them.
Qt 4 provides a qobject_cast<>() function that performs a dynamic cast based on the meta-information generated by moc for QObject subclasses. Unlike the standard C++ dynamic_cast<>() construct, qobject_cast<>() works even when RTTI is disabled, and it works correctly across DLL boundaries.
Here's the Qt 3 idiom to cast a type to a subtype:
// DEPRECATED
if (obj->inherits("QPushButton")) {
QPushButton *pushButton = (QPushButton *)obj;
...
}
The Qt 4 idiom is both cleaner and safer, because typos will always result in compiler errors:
QPushButton *pushButton = qobject_cast<QPushButton *>(obj);
if (pushButton) {
...
}
The QPointer<T> class provides a pointer to type T (where T inherits from QObject) that is automatically set to 0 when the referenced object is destroyed. Guarded pointers are useful whenever you want to store a pointer to an object you do not own.
Example:
QLabel *label = new QLabel;
QPointer<QLabel> safeLabel = label;
safeLabel->setText("Hello world!");
delete label;
// safeLabel is now 0, whereas label is a dangling pointer
QPointer<T> is more or less the same as the old QGuardedPtr<T> class, except that it is now implemented in a much more lightweight manner than before. The cost of one QPointer<T> object is now approximately the same as that of a signal--slot connection.
Qt 4はプラットフォーム透過なダブルバッファリングをサポートします.この特徴は,QWidget::setAttribute(Qt::WA_PaintOnScreen)を呼ぶことでウィジェットごとに機能を止めることができます.
この結果,すべての描画はpaintEvent()関数から行なわなければなりません(原文:must be done).これはMac OS XのHIView APIでも同様です.実際には,これはほとんど問題にはなりません.なぜなら描画イベントをつくる(原文:create paint event)ために,更新領域を引数にupdate()をコード内のどこからでも呼ぶことができるからです.
ポーティングを助けるために, QWidget は Qt::WA_PaintOutsidePaintEvent 属性をサポートします.この属性はWindowsやX11で paintEvent() の外での描画を可能とします.
Qt 4 provides an extension library that applications based on Qt 3, called Qt3Support, that Qt applications can link against. This allows for more compatibility than ever before, without bloating Qt.
To enable the Qt 3 support classes and functions, add the line
QT += qt3support
to your .pro file.
On Visual C++ 7 and GCC 3.2+, using compatibility functions often results in a compiler warning (e.g., "'find' is deprecated"). If you want to turn off that warning, add the line
DEFINES += QT3_SUPPORT
to your .pro file.
If you want to use compatibility functions but don't want to link against the Qt3Support library, add the line
DEFINES += QT3_SUPPORT_WARNINGS
or
DEFINES += QT3_SUPPORT
to your .pro file, depending on whether you want compatibility function calls to generate compiler warnings or not.
Qt 4.0 でサポートされるプラットフォームに関しては、 Trolltech's web site を参照してください。
[Next: The Tulip Container Classes]
| Copyright © 2005 Trolltech | Trademarks | Qt 4.0.0 |