![]()
|
__property や [property]
など非標準のコンパイラの機能に頼っていません。
私たちのソリューションは、サポートするすべてのプラットフォームの標準
C++ コンパイラで動作します。
これは、シグナルとスロットによるオブジェクト間通信を提供する
メタオブジェクトシステム
を基本としています。
クラス定義にある Q_PROPERTY マクロはプロパティを定義します。
プロパティは QObject を継承したクラスでのみ定義することができます。
2つめのマクロ Q_OVERRIDE は継承したプロパティをサブクラスで上書きします。
外側の世界から見ると、プロパティはデータメンバと全く同じに見えます。 しかし、プロパティには普通のデータメンバと異なる特徴がいくつかあります :
プロパティは、使っているクラスについて全く知らなくても QObject の一般の関数を使って読み書きすることができます。 以下の2つは同じ意味を持ちます :
//QButton * b と QObject * o は同じボタンを指す
b->setDown( TRUE );
o->setProperty( "down", TRUE );
この2つはほぼ同じですが、後者と比べ前者の方が速く、コンパイル時の診断が詳細に行われます。 そのため、利用できる場合は前者の方が好まれます。 しかし、どんな QObject でもそのオブジェクトの metaObject() 関数を使って、利用できるすべてのプロパティの一覧を得ることができるので、 setProperty() を使えばコンパイル時には利用できなかったクラスを操作することができます。
QObject::setProperty() と同様なものとして QObject::property() があります。 QMetaObject::propertyNames() は利用できるすべてのプロパティの名前を返します。 QMetaObject::property() は指定されたプロパティのプロパティデータを QMetaProperty オブジェクトとして返します。
以下は最も重要なプロパティ関数の使い方を示す簡単な例です :
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass( QObject * parent=0, const char * name=0 );
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority( Priority );
Priority priority() const;
};
このクラスにはメタオブジェクトシステムにまだ登録されていないプロパティ "priority"
があります。プロパティを登録するには Q_PROPERTY マクロを使ってそのプロパティを定義します。
その書き方は以下のようになります :
Q_PROPERTY( type name READ getFunction [WRITE setFunction]
[STORED bool] [DESIGNABLE bool] [RESET resetFunction])
定義を有効にするには、get(取得) 関数は const で、かつ自分自身の型、自分自身を指すポインタ、 自分自身を指す参照のいずれかを返さなければなりません。 また、オプションで作成する set(設定) 関数は void を返し、 引数を1つだけ (自分自身の型、自分自身を指すポインタまたは const 参照のどれか) 取らなければなりません。 メタオブジェクトコンパイラはこれを強制します。
プロパティの型は QVariant が提供する型か
クラスで定義している列挙型のどれかになることができます。
MyClass ではプロパティに列挙型 Priority
を使用しているので、この型はプロパティシステムに登録されます。
そうすると以下のように名前で値を設定することができるようになります :
obj->setProperty( "priority", "VeryHigh" );
列挙型は Q_ENUMS マクロで登録します。
以下はプロパティの定義を含む最後のクラス定義です。
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY( Priority priority READ priority WRITE setPriority )
Q_ENUMS( Priority )
public:
MyClass( QObject * parent=0, const char * name=0 );
~MyClass();
enum Priority { High, Low, VeryHigh, VeryLow };
void setPriority( Priority );
Priority priority() const;
};
他に同様のマクロとして Q_SETS があります。
これは Q_ENUMS と同様、列挙型を登録しますが、
さらに "集合(set)" としてマークします。
つまり列挙型の値同士で or をとることができます。
例えば、I/O クラスは列挙型の値 "Read" と "Write" を持つので "Read|Write" を受け取ります :
このような列挙型は Q_ENUMS ではなく Q_SETS で扱うのが最も簡単です。
Q_PROPERTY にある残りのキーワードは STORED,
DESIGNABLE, RESET です。
STORED はプロパティの値がオブジェクトに保管(store)
されるかどうかを定義します。
STORED は書き込み可能なプロパティでのみ意味を持ちます。
デフォルト値は true です。
DESIGNABLE はそのプロパティが GUI
デザイナープログラムによる変更に適しているかどうかを定義します。
書き込み可能なプロパティのデフォルトは true で、
書き込みできないプロパティでは false です。
RESET はプロパティをデフォルトの状態
(これは初期化してから変更されているかもしれません) に設定する関数を指定します。
その関数は void を返し、引数を取らない関数でなければなりません。
| Copyright © 2001 Trolltech | Trademarks | Qt version 2.3.2
|