QObject Class
QObject クラスは、すべての Qt オブジェクトの基本クラスです。詳細...
注意:このクラスの関数はすべてリエントラントです。
注意:これらの関数もスレッドセーフです:
- connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
- connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const
- connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type) constant.
- connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
- connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
- disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
- disconnect(const QObject *signal, const QObject *receiver, const char *method) const
- disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
- deleteLater()
プロパティ
- objectName : QString
パブリック関数
QObject(QObject *parent = nullptr) | |
virtual | ~QObject() |
QBindable<QString> | bindableObjectName() |
bool | blockSignals(bool block) |
const QObjectList & | children() const |
QMetaObject::Connection | connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const |
bool | disconnect(const QObject *receiver, const char *method = nullptr) const |
bool | disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const |
void | dumpObjectInfo() const |
void | dumpObjectTree() const |
QList<QByteArray> | dynamicPropertyNames() const |
virtual bool | event(QEvent *e) |
virtual bool | eventFilter(QObject *watched, QEvent *event) |
T | findChild(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
(since 6.7) T | findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
QList<T> | findChildren(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
(since 6.3) QList<T> | findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
QList<T> | findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
bool | inherits(const char *className) const |
void | installEventFilter(QObject *filterObj) |
(since 6.4) bool | isQuickItemType() const |
bool | isWidgetType() const |
bool | isWindowType() const |
void | killTimer(int id) |
(since 6.8) void | killTimer(Qt::TimerId id) |
virtual const QMetaObject * | metaObject() const |
bool | moveToThread(QThread *targetThread) |
QString | objectName() const |
QObject * | parent() const |
QVariant | property(const char *name) const |
void | removeEventFilter(QObject *obj) |
void | setObjectName(const QString &name) |
(since 6.4) void | setObjectName(QAnyStringView name) |
void | setParent(QObject *parent) |
bool | setProperty(const char *name, const QVariant &value) |
(since 6.6) bool | setProperty(const char *name, QVariant &&value) |
bool | signalsBlocked() const |
int | startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer) |
int | startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer) |
QThread * | thread() const |
パブリックスロット
void | deleteLater() |
シグナル
void | destroyed(QObject *obj = nullptr) |
void | objectNameChanged(const QString &objectName) |
静的パブリック・メンバー
QMetaObject::Connection | connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection) |
QMetaObject::Connection | connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) |
QMetaObject::Connection | connect(const QObject *sender, PointerToMemberFunction signal, Functor functor) |
QMetaObject::Connection | connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection) |
QMetaObject::Connection | connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection) |
bool | disconnect(const QMetaObject::Connection &connection) |
bool | disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method) |
bool | disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method) |
bool | disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method) |
const QMetaObject | staticMetaObject |
QString | tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1) |
保護された関数
virtual void | childEvent(QChildEvent *event) |
virtual void | connectNotify(const QMetaMethod &signal) |
virtual void | customEvent(QEvent *event) |
virtual void | disconnectNotify(const QMetaMethod &signal) |
bool | isSignalConnected(const QMetaMethod &signal) const |
int | receivers(const char *signal) const |
QObject * | sender() const |
int | senderSignalIndex() const |
virtual void | timerEvent(QTimerEvent *event) |
関連する非メンバー
QObjectList | |
T | qobject_cast(QObject *object) |
T | qobject_cast(const QObject *object) |
マクロ
(since 6.7) | QT_NO_CONTEXTLESS_CONNECT |
QT_NO_NARROWING_CONVERSIONS_IN_CONNECT | |
Q_CLASSINFO(Name, Value) | |
Q_EMIT | |
Q_ENUM(...) | |
Q_ENUM_NS(...) | |
Q_FLAG(...) | |
Q_FLAG_NS(...) | |
Q_GADGET | |
(since 6.3) | Q_GADGET_EXPORT(EXPORT_MACRO) |
Q_INTERFACES(...) | |
Q_INVOKABLE | |
(since 6.0) | Q_MOC_INCLUDE |
Q_NAMESPACE | |
Q_NAMESPACE_EXPORT(EXPORT_MACRO) | |
Q_OBJECT | |
Q_PROPERTY(...) | |
Q_REVISION | |
Q_SET_OBJECT_NAME(Object) | |
Q_SIGNAL | |
Q_SIGNALS | |
Q_SLOT | |
Q_SLOTS |
詳細説明
QObject は Qtオブジェクトモデルの中心です。このモデルの中心的な機能は、シグナルとスロットと呼ばれるシームレスなオブジェクト通信のための非常に強力なメカニズムです。connect() でシグナルをスロットに接続し、disconnect() で接続を破棄することができます。終わりのない通知ループを避けるために、blockSignals ()でシグナルを一時的にブロックすることができます。保護された関数connectNotify() とdisconnectNotify() は、接続を追跡することができます。
QObjectはオブジェクトツリーで構成されます。別のオブジェクトを親として QObject を作成すると、そのオブジェクトは自動的に親のchildren() リストに追加されます。親はオブジェクトの所有権を持ちます。つまり、デストラクタで自動的に子オブジェクトを削除します。findChild() やfindChildren() を使えば、名前と型からオブジェクトを探すことができます。
すべてのオブジェクトにはobjectName() があり、そのクラス名は対応するmetaObject() で見つけることができます(QMetaObject::className() を参照)。inherits() 関数を使用すると、オブジェクトのクラスが QObject 継承階層内の別のクラスを継承しているかどうかを調べることができます。
オブジェクトが削除されると、destroyed() シグナルが発生します。このシグナルをキャッチすることで、QObject へのダングリング参照を避けることができます。
QObject はevent() を通してイベントを受け取り、他のオブジェクトのイベントをフィルターすることができます。詳しくはinstallEventFilter() とeventFilter() を参照してください。便利なハンドラであるchildEvent() を再実装して、子イベントをキャッチすることができます。
最後になりましたが、QObject は Qt の基本的なタイマーサポートを提供します。タイマーのハイレベルなサポートについてはQChronoTimer を参照してください。
Q_OBJECT マクロは、シグナル、スロット、プロパティを実装するオブジェクトには必須です。また、ソースファイルに対してメタオブジェクトコンパイラを実行する必要があります。実際にシグナル、スロット、プロパティを使用するかどうかにかかわらず、QObjectのすべてのサブクラスでこのマクロを使用することを強くお勧めします。
すべての Qt ウィジェットは QObject を継承します。便利な関数isWidgetType() は、オブジェクトが実際にウィジェットであるかどうかを返します。qobject_cast<QWidget *>(obj) やobj->inherits("QWidget") よりもはるかに高速です。
いくつかの QObject 関数、例えばchildren() はQObjectList を返します。QObjectList はQList<QObject *> の typedef です。
スレッド親和性
QObject のインスタンスは、スレッド・アフィニティ(スレッド親和性)を持つ、つまり、特定のスレッドに住んでいると言われます。QObject がqueued signal またはポストされたイベントを受け取ると、そのスロットまたはイベントハンドラは、そのオブジェクトが住んでいるスレッドで実行されます。
Note: QObject がスレッド親和性を持たない場合(つまり、thread() がゼロを返す場合)、または実行中のイベントループを持たないスレッドに住んでいる場合、キューに入れられたシグナルやポストされたイベントを受け取ることはできません。
デフォルトでは、QObjectは作成されたスレッドに存在します。オブジェクトのスレッド・アフィニティは、thread() で照会でき、moveToThread() で変更できます。
すべてのQObjectは、親と同じスレッドに存在しなければなりません。その結果
- setParent()は、関係する2つのQObjectが異なるスレッドに住んでいる場合、失敗します。
- QObjectが別のスレッドに移動すると、そのすべての子も自動的に移動します。
- moveToThreadQObjectに親がある場合、()は失敗します。
- QObject がQThread::run() 内で作成された場合、QThread はQThread::run() を呼び出すスレッドに存在しないため、QThread オブジェクトの子になることはできません。
注意: QObject のメンバ変数が自動的にその子になるわけではありません。親子関係を設定するには、子のconstructor へのポインタを渡すか、setParent() を呼び出す必要があります。この手順を踏まないと、moveToThread() が呼び出されたとき、オブジェクトのメンバ変数は古いスレッドに残ります。
コピー・コンストラクタも代入演算子もない
QObjectにはコピー・コンストラクタも代入演算子もありません。これは設計によるものです。実際には、これらは宣言されていますが、Q_DISABLE_COPY ()というマクロを使ったprivate
セクションで宣言されています。実際、QObjectから派生したすべてのQtクラス(直接的または間接的)は、コピーコンストラクタと代入演算子をプライベートであると宣言するために、このマクロを使用します。その理由は QtObject ModelのページのIdentity vs Valueの議論にあります。
主な結果は、QObjectサブクラスを値として使いたくなるような場合には、QObject(またはQObjectサブクラス)へのポインタを使うべきだということです。例えば、コピー・コンストラクタがなければ、QObjectのサブクラスをコンテナ・クラスに格納する値として使用することはできません。ポインタを格納する必要があります。
自動接続
Qtのメタ・オブジェクト・システムは、QObjectのサブクラスとその子クラス間のシグナルとスロットを自動的に接続するメカニズムを提供します。オブジェクトが適切なオブジェクト名で定義され、スロットが単純な命名規則に従っている限り、この接続はQMetaObject::connectSlotsByName() 関数によって実行時に実行できます。
uic はこの関数を呼び出すコードを生成し、Qt Widgets Designer で作成されたフォームのウィジェット間で自動接続を実行できるようにします。Qt Widgets Designerを使用した自動接続の詳細については、Qt Widgets Designerマニュアルの「Using a Designer UI File in Your Application」を参照してください。
動的プロパティ
動的プロパティは、実行時に QObject インスタンスに追加したり、QObject インスタンスから削除したりすることができます。ダイナミック・プロパティは、コンパイル時に宣言する必要はありませんが、スタティック・プロパティと同じ利点を提供し、同じ API を使用して操作されます - 読み取りにはproperty() を使用し、書き込みにはsetProperty() を使用します。
動的プロパティはQt ウィジェットデザイナーでサポートされており、標準の Qt ウィジェットとユーザーが作成したフォームの両方に動的プロパティを与えることができます。
国際化 (I18n)
すべての QObject サブクラスは Qt の翻訳機能をサポートしており、アプリケーションのユーザーインターフェイスを異なる言語に翻訳することができます。
ユーザーから見えるテキストを翻訳可能にするには、tr() 関数の呼び出しでラップする必要があります。これについては「翻訳用ソースコードの記述」で詳しく説明しています。
QMetaObject 、QPointer 、QObjectCleanupHandler 、Q_DISABLE_COPY ()、オブジェクト・ツリーと所有権も参照してください 。
プロパティのドキュメント
[bindable]
objectName : QString
注意: このプロパティはQProperty バインディングをサポートしています。
このプロパティは、このオブジェクトの名前を保持します。
findChild() を使用すると、名前(とタイプ)でオブジェクトを見つけることができます。findChildren() を使用すると、オブジェクトのセットを検索できます。
qDebug("MyClass::setPrecision(): (%s) invalid precision %f", qPrintable(objectName()), newPrecision);
既定では、このプロパティには空の文字列が格納されます。
metaObject() およびQMetaObject::className()も参照してください 。
メンバ関数のドキュメント
[explicit invokable]
QObject::QObject(QObject *parent = nullptr)
親オブジェクトparent を持つオブジェクトを構築する。
オブジェクトの親は、オブジェクトの所有者とみなすことができる。例えば、dialog box は、それが含むOK とCancel ボタンの親です。
親オブジェクトのデストラクタは、すべての子オブジェクトを破棄します。
parent をnullptr
に設定すると、親を持たないオブジェクトが構築されます。オブジェクトがウィジェットの場合、トップレベル・ウィンドウになります。
注意: この関数はメタオブジェクトシステムや QML から呼び出すことができます。Q_INVOKABLE を参照してください。
parent()、findChild()、findChildren()も 参照してください。
[virtual noexcept]
QObject::~QObject()
オブジェクトを破棄し、すべての子オブジェクトを削除します。
オブジェクトとの間で送受信されるすべてのシグナルは自動的に切断され、オブジェクトに対する保留中のポスト・イベントはすべてイベント・キューから削除されます。ただし、QObject のサブクラスを直接削除するよりも、deleteLater() を使用した方が安全な場合が多いです。
警告 すべての子オブジェクトが削除されます。これらのオブジェクトのいずれかがスタックやグローバル上にある場合、遅かれ早かれプログラムはクラッシュします。親の外から子オブジェクトへのポインタを保持することはお勧めしません。それでも保持するのであれば、destroyed() シグナルを使えば、オブジェクトが破壊されたことを検知できます。
警告 QObject に配信されたイベントを処理している間に を削除すると、クラッシュすることがあります。現在実行中のスレッドとは異なるスレッドにQObject が存在する場合は、直接削除してはならない。代わりにdeleteLater() を使用してください。この場合、保留中のイベントがすべて配信された後に、イベント・ループがオブジェクトを削除します。
deleteLater()も参照のこと 。
[noexcept]
bool QObject::blockSignals(bool block)
block が true の場合、このオブジェクトが発するシグナルはブロックされます(つまり、シグナルを発しても、そのオブジェクトに接続されているものは何も呼び出されません)。block が偽の場合、そのようなブロックは発生しません。
戻り値はsignalsBlocked() の前の値である。
このオブジェクトのシグナルがブロックされていても、destroyed() シグナルは発せられることに注意。
ブロックされている間に発せられたシグナルは、バッファリングされません。
signalsBlocked() およびQSignalBlockerも参照のこと 。
[virtual protected]
void QObject::childEvent(QChildEvent *event)
このイベント・ハンドラは、子イベントを受け取るためにサブクラスで再実装することができる。イベントはevent パラメータで渡されます。
QEvent::ChildAdded と イベントは、子が追加されたり削除されたりしたときにオブジェクトに送られます。どちらの場合も、子が であること、あるいは () が を返す場合は であることだけを頼りにすることができます(これは、 の場合は子がまだ完全に構築されておらず、 の場合はすでに破棄されている可能性があるためです)。QEvent::ChildRemoved QObject isWidgetType true
QWidget ChildAdded ChildRemoved
QEvent::ChildPolished イベントは、子プロセスがポリッシュされたとき、またはポリッシュされた子プロセスが追加されたときに、ウィジェットに送信されます。子プロセスの polished イベントを受信した場合、通常、子プロセスの構築は完了しています。ただし、これは保証されるものではなく、ウィジェットのコンストラクタの実行中に複数の polished イベントが送られることがあります。
子ウィジェットごとに、ChildAdded イベントを 1 つ、ChildPolished イベントを 0 つ以上、ChildRemoved イベントを 1 つ受信します。
子ウィジェットが追加された直後に削除された場合、ChildPolished イベントは省略されます。子ウィジェットが構築中と破棄中に何度も磨かれる場合、同じ子ウィジェットに対して複数の磨かれた子ウィジェット・イベントを受け取ることがあります。
event()も参照してください 。
const QObjectList &QObject::children() const
子オブジェクトのリストを返します。QObjectList クラスは<QObject>
ヘッダーファイルで以下のように定義されている:
typedef QList<QObject*> QObjectList;
最初に追加された子オブジェクトはリスト内のfirst 、最後に追加された子オブジェクトはリスト内のlast 。
QWidget の子がraised またはlowered の場合、リストの順序が変わることに注意してください。上げられたウィジェットはリストの最後のオブジェクトになり、下げられたウィジェットはリストの最初のオブジェクトになります。
findChild()、findChildren()、parent()、setParent()も参照 。
[static]
QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
sender オブジェクトのsignal からreceiver オブジェクトのmethod へ、与えられたtype の接続を作成します。後で接続を切断するために使用できる、接続へのハンドルを返します。
Connectionハンドルは、例えばパラメータが無効であったなど、接続を作成できなかった場合には無効となります。QMetaObject::Connection が有効かどうかは、bool にキャストすることで確認できます。
この関数はconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
と同じように動作しますが、シグナルとメソッドの指定にQMetaMethod を使用します。
connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)も参照してください 。
[static]
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
sender オブジェクトのsignal からreceiver オブジェクトのmethod へ、与えられたtype の接続を作成します。後で接続を切断するために使用できる接続へのハンドルを返します。
例えば、signal とmethod を指定する場合、SIGNAL()
とSLOT()
マクロを使用する必要があります:
QLabel *label = new QLabel; QScrollBar *scrollBar = new QScrollBar; QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));
この例では、ラベルが常に現在のスクロールバー値を表示するようにします。signalとslotsのパラメータには変数名を含めてはいけない。例えば、次のように指定すると動作せず、falseを返します:
// WRONG QObject::connect(scrollBar, SIGNAL(valueChanged(int value)), label, SLOT(setNum(int value)));
シグナルは別のシグナルに接続することもできます:
class MyWidget : public QWidget { Q_OBJECT public: MyWidget(); signals: void buttonClicked(); private: QPushButton *myButton; }; MyWidget::MyWidget() { myButton = new QPushButton(this); connect(myButton, SIGNAL(clicked()), this, SIGNAL(buttonClicked())); }
この例では、MyWidget
コンストラクタがプライベート・メンバ変数からシグナルをリレーし、MyWidget
に関連する名前で利用できるようにしています。
シグナルは多くのスロットやシグナルに接続することができます。多くのシグナルを1つのスロットに接続することができます。
シグナルが複数のスロットに接続されている場合、シグナルが発信されると、接続された順番にスロットがアクティブになります。
この関数は、シグナルとスロットの接続に成功した場合、接続ハンドルを表すQMetaObject::Connection を返します。接続ハンドルは、例えば、QObject がsignal またはmethod の存在を確認できない場合や、それらの署名に互換性がない場合など、接続を作成できない場合には無効となります。ハンドルが有効かどうかは、ハンドルをboolにキャストすることで確認できます。
デフォルトでは、接続が行われるたびにシグナルが発行され、重複接続の場合は2つのシグナルが発行されます。これらの接続をすべて切断するには、disconnect ()を1回呼び出す。Qt::UniqueConnection type を渡すと、重複接続でない場合のみ接続が行われる。すでに重複している場合(同じオブジェクトのまったく同じスロットにまったく同じシグナル)、接続は失敗し、connectは無効なQMetaObject::Connection を返します。
注意: Qt::UniqueConnectionsは、ラムダ、非メンバー関数、ファンクタに対しては機能しません。
オプションのtype パラメータは、確立する接続のタイプを記述します。特に、特定のシグナルを即座にスロットに配信するか、後で配信するためにキューに入れるかを決定します。シグナルがキューイングされる場合、Qtは裏で引数をコピーしてイベントに格納する必要があるため、パラメータはQtのメタオブジェクトシステムが知っている型でなければなりません。キューイングされた接続を使おうとして、エラーメッセージが表示された場合
QObject::connect: Cannot queue arguments of type 'MyType' (Make sure 'MyType' is registered using qRegisterMetaType().)
接続を確立する前に、qRegisterMetaType() を呼び出してデータ型を登録してください。
注意:この関数はスレッド・セーフである。
disconnect()、sender()、qRegisterMetaType()、Q_DECLARE_METATYPE()、文字列ベース接続とファンクタ・ベース接続の違いも参照 。
[static]
template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
この関数は connect() をオーバーロードしたものです。
sender オブジェクトのsignal からfunctor への接続を作成し、その接続へのハンドルを返します。
シグナルは、ヘッダーでシグナルとして宣言された関数でなければなりません。スロット関数は、シグナルに接続できる任意の関数またはファンクタである。スロット関数は、シグナルが少なくともスロット関数と同じ数の引数を持っていれば、与えられたシグナルに接続することができます。シグナルとスロットの対応する引数の型の間には暗黙の変換が存在しなければなりません。
例
void someFunction(); QPushButton *button = new QPushButton; QObject::connect(button, &QPushButton::clicked, someFunction);
ラムダ式も使用できます:
QByteArray page = ...; QTcpSocket *socket = new QTcpSocket; socket->connectToHost("qt-project.org", 80); QObject::connect(socket, &QTcpSocket::connected, [=] () { socket->write("GET " + page + "\r\n"); });
送信者が破壊されると、接続は自動的に切断される。ただし、シグナルが発信されたときに、ファンクタ内で使用されているオブジェクトがまだ生きているように注意する必要があります。
このため、レシーバー/コンテキストとしてQObject も受け取る connect() のオーバーロードを使用することを推奨する。QT_NO_CONTEXTLESS_CONNECT
マクロを定義することで、コンテキストのないオーバーロードの使用を無効にすることができる。
オーバーロードされた関数は、qOverload の助けを借りて解決できる。
注:この関数はスレッドセーフです。
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
この関数は connect() をオーバーロードする。
sender オブジェクトからこのオブジェクトのmethod にsignal を接続する。
connect(sender,signal,this
,method,type) と同等。
接続するたびにシグナルが出力されるので、重複した接続は2つのシグナルを出力します。接続を切断するにはdisconnect() を使用します。
注意:この関数はスレッドセーフです。
disconnect()も参照 。
[static]
template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
この関数は connect() をオーバーロードします。
sender オブジェクトのsignal からfunctor へ、context の特定のイベントループに配置される、指定されたtype の接続を作成し、接続へのハンドルを返します。
注意: Qt::UniqueConnections は、ラムダ、非メンバー関数、ファンクターでは動作しません。
シグナルは、ヘッダでシグナルとして宣言された関数でなければなりません。スロット関数は、シグナルに接続できる関数やファンクタであれば何でもかまいません。スロット関数は、シグナルが少なくともスロット関数と同じ数の引数を持っていれば、与えられたシグナルに接続することができます。シグナルとスロットの対応する引数の型の間には暗黙の変換が存在しなければなりません。
例
void someFunction(); QPushButton *button = new QPushButton; QObject::connect(button, &QPushButton::clicked, this, someFunction, Qt::QueuedConnection);
ラムダ式も使用できます:
QByteArray page = ...; QTcpSocket *socket = new QTcpSocket; socket->connectToHost("qt-project.org", 80); QObject::connect(socket, &QTcpSocket::connected, this, [=] () { socket->write("GET " + page + "\r\n"); }, Qt::AutoConnection);
送信者またはコンテキストが破棄されると、接続は自動的に切断されます。ただし、シグナルが発信されたときに、ファンクタ内で使用されているオブジェクトがまだ生きているように注意する必要があります。
オーバーロードされた関数はqOverload で解決できます。
注意:この関数はスレッドセーフです。
[static]
template <typename PointerToMemberFunction> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
この関数は connect() をオーバーロードします。
sender オブジェクトのsignal からreceiver オブジェクトのmethod へ、与えられたtype の接続を作成します。後で接続を切断するために使用できる、接続へのハンドルを返します。
シグナルは、ヘッダーでシグナルとして宣言された関数でなければならない。スロット関数は、シグナルに接続できる任意のメンバ関数である。シグナルが少なくともスロットと同じ数の引数を持ち、シグナルとスロットの対応する引数の型の間に暗黙の変換がある場合、スロットは与えられたシグナルに接続することができます。
例
QLabel *label = new QLabel; QLineEdit *lineEdit = new QLineEdit; QObject::connect(lineEdit, &QLineEdit::textChanged, label, &QLabel::setText);
この例では、ラベルが常に現在行の編集テキストを表示するようにします。
シグナルは多くのスロットやシグナルに接続することができます。多くのシグナルを1つのスロットに接続することができます。
シグナルが複数のスロットに接続されている場合、シグナルが発信されると、接続された順序と同じ順序でスロットがアクティブになります。
この関数は、シグナルとスロットの接続に成功すると、コネクションのハンドルを返します。例えば、QObject がsignal の存在を確認できない場合(それがシグナルとして宣言されていない場合)、接続を作成できない場合、接続ハンドルは無効になります。QMetaObject::Connection が有効かどうかは、それを bool にキャストすることで確認できます。
デフォルトでは、接続が行われるたびにシグナルが発行され、重複接続の場合は2つのシグナルが発行されます。これらの接続をすべて切断するには、disconnect() を 1 回呼び出します。Qt::UniqueConnection type を渡すと、重複接続でない場合のみ接続が行われる。すでに重複(同じオブジェクトのまったく同じスロットにまったく同じシグナル) がある場合、接続は失敗し、connectは無効なQMetaObject::Connection を返します。
オプションのtype パラメータは、確立する接続のタイプを記述します。特に、特定のシグナルを即座にスロットに配信するか、後で配信するためにキューに入れるかを決定します。シグナルがキューイングされる場合、Qtは裏で引数をコピーしてイベントに格納する必要があるため、パラメータはQtのメタオブジェクトシステムが知っている型でなければなりません。キューイングされた接続を使おうとしてエラーメッセージが表示された場合は、次のようにしてください。
QObject::connect: Cannot queue arguments of type 'MyType' (Make sure 'MyType' is registered using qRegisterMetaType().)
で引数の型を宣言してください。Q_DECLARE_METATYPE
オーバーロードされた関数はqOverload を使って解決できます。
注意:この関数はスレッドセーフです。
文字列ベース接続とファンクタベース接続の違い」も参照してください 。
[virtual protected]
void QObject::connectNotify(const QMetaMethod &signal)
この仮想関数は、このオブジェクトのsignal に何かが接続されると呼び出されます。
signal を特定のシグナルと比較したい場合は、以下のようにQMetaMethod::fromSignal() を使用することができる:
if (signal == QMetaMethod::fromSignal(&MyObject::valueChanged)) { // signal is valueChanged }
警告: 警告:この関数は、オブジェクト指向のモジュール性の原則に違反しています。しかし、何かがシグナルに接続されている場合にのみ、高価な初期化を行う必要がある場合には便利かもしれません。
警告 この関数は接続を実行するスレッドから呼び出され、そのスレッドはこのオブジェクトが存在するスレッドとは異なるスレッドである可能性があります。この関数は、QObject 内部ミューテックスをロックした状態で呼び出されることもあります。したがって、再実装からisSignalConnected() を含むQObject 関数に再入力することはできません。再実装でミューテックスをロックする場合、そのミューテックスを他の場所で保持したままQObject 関数を呼び出さないようにしてください。
connect() およびdisconnectNotify()も参照の こと。
[virtual protected]
void QObject::customEvent(QEvent *event)
このイベント・ハンドラは、カスタム・イベントを受け取るためにサブクラスで再実装できます。カスタム・イベントは、QEvent::Type enumのQEvent::User 項目と少なくとも同じ大きさの型値を持つユーザー定義イベントで、通常はQEvent サブクラスです。イベントはevent パラメータで渡される。
[slot]
void QObject::deleteLater()
このオブジェクトの削除をスケジュールします。
このオブジェクトは、制御がイベント・ループに戻ったときに削除されます。この関数が呼び出されたときにイベント・ループが実行されていない場合 (例えば、QCoreApplication::exec() の前にオブジェクトに対して deleteLater() が呼び出された場合)、イベント・ループが開始されると、オブジェクトは削除されます。メイン・イベント・ループが停止した後に deleteLater() が呼び出された場合、オブジェクトは削除されません。イベント・ループが実行されていないスレッドに存在するオブジェクトに対して deleteLater() が呼び出された場合、そのスレッドが終了するとオブジェクトは破棄されます。
オブジェクトを削除するには、deleteLater() が呼び出されたイベントループにコントロールが戻る必要があります。オブジェクトが削除されるためには、コントロールは deleteLater() が呼び出されたイベントループに戻らなければなりません。これは、ネストされた以前のイベントループがまだ実行されている間に削除されたオブジェクトには適用されません。
Qt がQCoreApplication::exec() やQEventLoop::exec() などでイベントディスパッチャを駆動していない状況では、遅延削除は自動的に処理されません。このシナリオで遅延削除を確実に行うには、以下の回避策を使用することができます:
const auto *eventDispatcher = QThread::currentThread()->eventDispatcher(); QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, QThread::currentThread(), []{ if (QThread::currentThread()->loopLevel() == 0) QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); } );
注意:この関数はスレッドセーフである。
destroyed() およびQPointerも参照のこと 。
[signal]
void QObject::destroyed(QObject *obj = nullptr)
このシグナルは、QPointer のインスタンスが通知された後、オブジェクトobj が破棄される直前に発行され、ブロックすることはできません。
オブジェクトの子オブジェクトはすべて、このシグナルが発せられた直後に破棄される。
deleteLater() およびQPointerも参照のこと 。
[static]
bool QObject::disconnect(const QMetaObject::Connection &connection)
接続を切断する。
connection が無効であるか、すでに切断されている場合は、何もせずに false を返します。
connect()も参照 。
[static]
bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
オブジェクトsender 内のsignal を、オブジェクトreceiver 内のmethod から切断します。接続が正常に切断された場合はtrue
を返し、そうでない場合はfalse
を返す。
この関数は、disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
と同じ可能性を提供しますが、QMetaMethod を使用して、切断されるシグナルとメソッドを表します。
さらに、この関数は、以下の場合にfalseを返し、シグナルもスロットも切断されません:
- signal が送信者クラスまたはその親クラスのメンバでない場合。
- method は、受信者クラスまたはその親クラスのメンバではありません。
- signal インスタンスがシグナルでない。
注: connect() および対応する disconnect() 呼び出しでは、SIGNAL
およびSLOT
マクロを使用した、ポインタ・トゥ・メンバ関数または文字列ベースの同じ構文を使用します。
ミスマッチを避けるには、connect ()によって返された接続ハンドルを保存し、disconnect ()の呼び出しでそれを使用します。
QMetaMethod()は、"任意のシグナル "または "受信オブジェクトの任意のスロット "という意 味で、ワイルドカードとして使用できます。同じように、nullptr
は、「任意の受信オブジェクト」という意味で、receiver に使用することができます。この場合、メソッドもQMetaMethod()でなければならない。sender パラメータは決してnullptr
。
注意: すべてのシグナル・スロット接続を切断すると、QObject::destroyed ()シグナルが接続されている場合も切断されます。このようにすると、リソースのクリーンアップのためにこのシグナルに依存しているクラスに悪影響を及ぼす可能性があります。アプリケーション・コードによって接続された特定のシグナルのみを切断することを推奨します。
disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)も参照してください 。
[static]
bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
オブジェクトsender 内のsignal を、オブジェクトreceiver 内のmethod から切断する。接続が正常に切断された場合はtrue
を返し、そうでない場合はfalse
を返す。
シグナル・スロットの接続は、関係するオブジェクトのいずれかが破棄されると削除される。
disconnect()は通常、以下の例のように3つの方法で使用されます。
- オブジェクトのシグナルに接続されているすべてを切断する:
disconnect(myObject, nullptr, nullptr, nullptr);
静的でないオーバーロード関数
myObject->disconnect();
- 特定のシグナルに接続されているものすべてを切断する:
disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);
非静的オーバーロード関数と同等
myObject->disconnect(SIGNAL(mySignal()));
- 特定のレシーバーを切断する:
disconnect(myObject, nullptr, myReceiver, nullptr);
非静的オーバーロード関数と同等
myObject->disconnect(myReceiver);
注: connect() および対応する disconnect() 呼び出しでは、SIGNAL
およびSLOT
マクロを使用した、ポインタ・トゥ・メンバ関数または文字列ベースの同じ構文を使用する。
不一致を避けるには、connect () が返す接続ハンドルを保存し、disconnect ()の呼び出しでそれを使用する。
nullptr
はワイルドカードとして使用でき、それぞれ「任意のシグナル」、 「任意の受信オブジェクト」、「受信オブジェクトの任意のスロット」を意味する。
sender がnullptr
になることはない(1回の呼び出しで、複数のオブジェクトからシグナ ルを切断することはできない)。
signal がnullptr
の場合、receiver とmethod のシグナルを切断する。そうでない場合は、指定されたシグナルのみが切断される。
receiver がnullptr
の場合、signal に接続されているすべての接続を切断する。そうでない場合、receiver 以外のオブジェクトのスロットは切断されない。
method がnullptr
の場合、receiver に接続されているものはすべて切断されます。そうでない場合、method という名前のスロットだけが切断され、それ以外のスロットはそのまま残されます。receiver が抜けている場合、method はnullptr
でなければならないので、すべてのオブジェクトで特定の名前のスロットを切断することはできない。
注意: すべてのシグナル・スロットの接続を切断すると、QObject::destroyed ()シグナルが接続されている場合も切断されます。これは、リソースのクリーンアップのためにこのシグナルに依存しているクラスに悪影響を与える可能性があります。アプリケーション・コードによって接続された特定のシグナルのみを切断することを推奨します。
注意:この関数はスレッドセーフです。
connect()も参照してください 。
bool QObject::disconnect(const QObject *receiver, const char *method = nullptr) const
この関数は disconnect() をオーバーロードします。
このオブジェクトのすべてのシグナルをreceiver のmethod から切断します。
注 :connect() および対応する disconnect() 呼び出しでは、SIGNAL
およびSLOT
マクロを使用した、ポインタ・トゥ・メンバ関数または文字列ベースの同じ構文を使用する。
ミスマッチを避けるため、connect () が返す接続ハンドルを保存し、disconnect ()の呼び出しで使用する。
シグナル・スロット接続は、関係するオブジェクトのいずれかが破棄されると削除される。
bool QObject::disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const
この関数は disconnect() をオーバーロードしている。
receiver のmethod からsignal を切断する。
注: connect() および対応する disconnect() 呼び出しでは、SIGNAL
およびSLOT
マクロを使用した、ポインタ・トゥ・メンバ関数または文字列ベースの同じ構文を使用する。
ミスマッチを避けるため、connect () が返す接続ハンドルを保存し、disconnect ()の呼び出しで使用する。
シグナル・スロット接続は、関係するオブジェクトのいずれかが破棄されると削除されます。
注意: すべてのシグナル・スロット接続を切断すると、QObject::destroyed() シグナルが接続されている場合も切断されます。このようにすると、リソースのクリーンアップのためにこのシグナルに依存しているクラスに悪影響を与える可能性があります。アプリケーション・コードによって接続された特定のシグナルのみを切断することをお勧めします。
注:この関数はスレッドセーフである。
[static]
template <typename PointerToMemberFunction> bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
この関数は disconnect() をオーバーロードする。
オブジェクトsender 内のsignal をオブジェクトreceiver 内のmethod から切断する。接続が正常に切断された場合はtrue
を返し、そうでない場合はfalse
を返します。
シグナル・スロット接続は、関係するオブジェクトのいずれかが破棄されると削除されます。
disconnect()は、以下の例が示すように、通常3つの方法で使用されます。
- オブジェクトのシグナルに接続されているすべてを切断する:
disconnect(myObject, nullptr, nullptr, nullptr);
- 特定のシグナルに接続されているものすべてを切断する:
disconnect(myObject, &MyObject::mySignal(), nullptr, nullptr);
- 特定のレシーバーを切断する:
disconnect(myObject, nullptr, myReceiver, nullptr);
- 特定の信号から特定のスロットへの接続を切断する:
nullptr
は、それぞれ「任意のシグナル」、「任意の受信オブジェクト」、「受信オブジェクトの任意のスロット」を意味するワイルドカードとして使用することができる。
sender がnullptr
になることはない(1回の呼び出しで、複数のオブジェクトからシグナ ルを切断することはできない)。
signal がnullptr
の場合、receiver とmethod のシグナルを切断する。そうでない場合は、指定されたシグナルのみが切断される。
receiver がnullptr
の場合、signal に接続されているすべての接続が切断される。そうでない場合、指定されたレシーバのスロットのみが切断される。receiver が NULL でない disconnect() は、receiver をコンテキスト・オブジェクトとして接続されていたスロット関数も切断する。
method がnullptr
である場合、receiver に接続されているものはすべて切断されます。そうでない場合、method という名前のスロットだけが切断され、他のスロットはすべて放置されます。receiver が抜けている場合、method はnullptr
でなければならないので、すべてのオブジェクトで特定の名前のスロットを切断することはできない。
注意: このオーバーロードを使用して、ファンクターやラムダ式に接続されたシグナルを切断することはできません。それは、それらを比較することができないからです。代わりに、QMetaObject::Connection を取るオーバーロードを使用してください。
注: method がnullptr
でない限り、この関数は、文字列ベースのバージョンのconnect ()を使用して作成された接続も切断しない。このような接続を切断するには、対応する文字列ベースの disconnect()のオーバーロードを使用する。
注意:この関数はスレッドセーフである。
connect()も参照のこと 。
[virtual protected]
void QObject::disconnectNotify(const QMetaMethod &signal)
この仮想関数は、このオブジェクトのsignal から何かが切断されたときに呼び出される。
signal と特定のシグナルを比較する例については、connectNotify() を参照。
このオブジェクトからすべてのシグナルが切断された場合(例えば、disconnect() のシグナル引数がnullptr
だった場合)、 disconnectNotify() は一度だけ呼び出され、signal は無効なQMetaMethod となる (QMetaMethod::isValid() はfalse
を返す )。
警告: この関数は、オブジェクト指向の原則であるモジュール性に違反している。しかし、高価なリソースへのアクセスを最適化するためには有用かもしれない。
警告 この関数は切断を実行するスレッドから呼び出され、そのスレッドはこのオブジェクトが存在するスレッドとは異なるスレッドである可能性があります。この関数は、QObject 内部ミューテックスがロックされた状態で呼び出されることもあります。そのため、再実装からisSignalConnected() を含むQObject 関数に再入力することはできません。再実装でミューテックスをロックする場合、そのミューテックスを他の場所で保持したままQObject 関数を呼び出さないように注意してください。
disconnect() およびconnectNotify()も参照の こと。
void QObject::dumpObjectInfo() const
このオブジェクトのシグナル接続などの情報をデバッグ出力にダンプします。
注意: Qt 5.9以前では、この関数はconstではありませんでした。
dumpObjectTree()も参照してください 。
void QObject::dumpObjectTree() const
子オブジェクトのツリーをデバッグ出力にダンプします。
注意: Qt 5.9以前では、この関数はconstではありませんでした。
dumpObjectInfo()も参照して ください。
QList<QByteArray> QObject::dynamicPropertyNames() const
setProperty() を使用してオブジェクトに動的に追加されたすべてのプロパティの名前を返します。
[virtual]
bool QObject::event(QEvent *e)
この仮想関数は、オブジェクトへのイベントを受け取り、イベントe が認識され、処理された場合、true を返す必要があります。
event() 関数は、オブジェクトの振る舞いをカスタマイズするために再実装することができます。
処理しなかったイベントについては、必ず親イベント・クラスの実装を呼び出してください。
例
class MyClass : public QWidget { Q_OBJECT public: MyClass(QWidget *parent = nullptr); ~MyClass(); bool event(QEvent* ev) override { if (ev->type() == QEvent::PolishRequest) { // overwrite handling of PolishRequest if any doThings(); return true; } else if (ev->type() == QEvent::Show) { // complement handling of Show if any doThings2(); QWidget::event(ev); return true; } // Make sure the rest of events are handled return QWidget::event(ev); } };
installEventFilter()、timerEvent()、QCoreApplication::sendEvent()、QCoreApplication::postEvent()も参照 。
[virtual]
bool QObject::eventFilter(QObject *watched, QEvent *event)
このオブジェクトがwatched オブジェクトのイベント・フィルターとしてインストールされている場合、イベントをフィルターします。
この関数の再実装で、event をフィルタリングしたい場合、つまり、それ以上処理されないようにしたい場合は、true を返し、そうでない場合は false を返します。
例
class MainWindow : public QMainWindow { public: MainWindow(); protected: bool eventFilter(QObject *obj, QEvent *ev) override; private: QTextEdit *textEdit; }; MainWindow::MainWindow() { textEdit = new QTextEdit; setCentralWidget(textEdit); textEdit->installEventFilter(this); } bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (obj == textEdit) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); qDebug() << "Ate key press" << keyEvent->key(); return true; } else { return false; } } else { // pass the event on to the parent class return QMainWindow::eventFilter(obj, event); } }
例:上の例では、処理されなかったイベントは、ベースクラスの eventFilter() 関数に渡されます。
伝搬を防ぐために、QEvent::ShortcutOverride のようないくつかのイベントは、明示的に(accept() を呼び出すことで)受け入れなければなりません。
警告 この関数でReceiverオブジェクトを削除する場合は、必ずtrueを返してください。そうしないと、Qt は削除されたオブジェクトにイベントを転送し、プログラムがクラッシュする可能性があります。
installEventFilter()も参照してください 。
template <typename T> T QObject::findChild(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
このオブジェクトの子オブジェクトで、T型にキャストでき、name 、そのようなオブジェクトがない場合はnullptr
を返します。引数name が NULL の場合、すべてのオブジェクトがマッチします。空で NULL ではないname は、objectName が空であるオブジェクトにのみマッチします。検索は、options で FindDirectChildrenOnly オプションが指定されていない限り、再帰的に実行されます。
検索にマッチする子が複数ある場合は、最も直接の祖先が返されます。最直属の先祖が複数ある場合は、children() の最初の子が返されます。その場合は、findChildren() を使用して、すべての子の完全なリストを取得する方がよいでしょう。
この例では、ボタンが親の直接の子でなくても、"button1"
というparentWidget
の子QPushButton
を返します:
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
この例は、parentWidget
の子QListWidget
を返します:
QListWidget *list = parentWidget->findChild<QListWidget *>();
この例は、parentWidget
(その直接の親)の子QPushButton
を返します。名前は"button1"
です:
QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);
この例は、直接の親であるparentWidget
の子QListWidget
を返します:
QListWidget *list = parentWidget->findChild<QListWidget *>(Qt::FindDirectChildrenOnly);
注意: Qt 6.7 より前のバージョンでは、この関数はQAnyStringView
ではなくQString
としてname を受け取っていました。
findChildren()も参照してください 。
[since 6.7]
template <typename T> T QObject::findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
これはオーバーロードされた関数です。
T型にキャストできるこのオブジェクトの子オブジェクトを返すか、そのようなオブジェクトがない場合はnullptr
を返します。options で FindDirectChildrenOnly オプションが指定されていない限り、検索は再帰的に実行されます。
検索にマッチする子が複数ある場合は、最も直接の祖先が返されます。最直属の先祖が複数ある場合は、children() の最初の子が返されます。その場合は、findChildren() を使用して、すべての子の完全なリストを取得する方がよいでしょう。
この関数は Qt 6.7 で導入されました。
findChildren()も参照してください 。
template <typename T> QList<T> QObject::findChildren(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
与えられたname を持つこのオブジェクトのすべての子オブジェクトで、T 型にキャストできるもの、またはそのようなオブジェクトがない場合は空のリストを返します。引数name が NULL の場合はすべてのオブジェクトがマッチし、空の場合はobjectName が空であるオブジェクトのみがマッチします。検索は、options で FindDirectChildrenOnly オプションが指定されていない限り、再帰的に実行されます。
次の例は、指定されたparentWidget
の子QWidget
のリストをwidgetname
という名前で検索する方法を示しています:
この例では、parentWidget
の子であるすべてのQPushButton
を返します:
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
この例では、parentWidget
の直接の子であるQPushButton
をすべて返します:
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(Qt::FindDirectChildrenOnly);
注意: Qt 6.7 より前のバージョンでは、この関数はQAnyStringView
ではなくQString
としてname を受け取っていました。
findChild()も参照してください 。
[since 6.3]
template <typename T> QList<T> QObject::findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
これはオーバーロードされた関数です。
T型にキャストできるこのオブジェクトのすべての子オブジェクト、またはそのようなオブジェクトがない場合は空のリストを返します。検索は、options が FindDirectChildrenOnly オプションを指定しない限り、再帰的に実行されます。
この関数は Qt 6.3 で導入されました。
findChild()も参照してください 。
template <typename T> QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
この関数は findChildren() をオーバーロードします。
このオブジェクトの子オブジェクトのうち、T型にキャストでき、かつ、正規表現re にマッチする名前を持つオブジェクトを返します。options で FindDirectChildrenOnly オプションが指定されていない限り、検索は再帰的に実行されます。
bool QObject::inherits(const char *className) const
このオブジェクトがclassName を継承するクラス、またはclassName を継承するQObject サブクラスのインスタンスである場合はtrue
を返し、そうでない場合はfalse
を返します。
クラスはそれ自身を継承するとみなされます。
例
QTimer *timer = new QTimer; // QTimer inherits QObject timer->inherits("QTimer"); // returns true timer->inherits("QObject"); // returns true timer->inherits("QAbstractButton"); // returns false // QVBoxLayout inherits QObject and QLayoutItem QVBoxLayout *layout = new QVBoxLayout; layout->inherits("QObject"); // returns true layout->inherits("QLayoutItem"); // returns true (even though QLayoutItem is not a QObject)
例: オブジェクトをキャストするために、そのオブジェクトが特定のクラスのインスタンスであるかどうかを判断する必要がある場合は、代わりにqobject_cast<Type *>(object) を使用することを検討してください。
metaObject() およびqobject_cast()も参照 。
void QObject::installEventFilter(QObject *filterObj)
このオブジェクトにイベント・フィルターfilterObj をインストールします。例えば
monitoredObj->installEventFilter(filterObj);
イベント・フィルターは、このオブジェクトに送られるすべてのイベントを受け取るオブジェクトです。フィルタは、イベントを停止するか、このオブジェクトに転送します。イベント・フィルターfilterObj は、そのeventFilter() 関数を通してイベントを受信します。eventFilter()関数は、イベントがフィルターされるべき(つまり停止されるべき)場合はtrueを返し、そうでない場合はfalseを返さなければならない。
1つのオブジェクトに複数のイベントフィルターがインストールされている場合、最後にインストールされたフィルターが最初に有効になります。
このオブジェクトにfilterObj がすでにインストールされている場合、この関数はそれを移動させ、あたかも最後にインストールされたかのように動作します。
以下は、監視対象オブジェクトのキー入力を食べるKeyPressEater
クラスです:
class KeyPressEater : public QObject { Q_OBJECT ... protected: bool eventFilter(QObject *obj, QEvent *event) override; }; bool KeyPressEater::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); qDebug("Ate key press %d", keyEvent->key()); return true; } else { // standard event processing return QObject::eventFilter(obj, event); } }
そして、これを2つのウィジェットにインストールする方法を示します:
KeyPressEater *keyPressEater = new KeyPressEater(this); QPushButton *pushButton = new QPushButton(this); QListView *listView = new QListView(this); pushButton->installEventFilter(keyPressEater); listView->installEventFilter(keyPressEater);
例えば、QShortcut クラスは、このテクニックを使ってショートカット・キーの押下を傍受します。
警告: 警告:eventFilter() 関数で受信オブジェクトを削除する場合は、必ず true を返してください。falseを返すと、削除されたオブジェクトにイベントが送られ、プログラムがクラッシュします。
フィルタリングオブジェクトは、このオブジェクトと同じスレッドになければならないことに注意してください。filterObj が別のスレッドにある場合、この関数は何もしません。この関数を呼び出した後、filterObj またはこのオブジェクトのどちらかが別のスレッドに移動した場合、両方のオブジェクトが再び同じスレッド親和性を持つまで、イベント・フィルターは呼び出されません(削除されません)。
removeEventFilter()、eventFilter()、event()も参照 。
[since 6.4]
bool QObject::isQuickItemType() const
オブジェクトがQQuickItem の場合はtrue
を返し、そうでない場合はfalse
を返す。
この関数を呼び出すことは、inherits("QQuickItem")
を呼び出すことと同じですが、より高速です。
この関数はQt 6.4で導入されました。
[protected]
bool QObject::isSignalConnected(const QMetaMethod &signal) const
signal が少なくとも1つのレシーバに接続されていればtrue
を返し、そうでなければfalse
を返します。
signal はこのオブジェクトのシグナル・メンバでなければならず、そうでなければ動作は未定義です。
static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged); if (isSignalConnected(valueChangedSignal)) { QByteArray data; data = get_the_value(); // expensive operation emit valueChanged(data); }
上記のコード・スニペットが示すように、この関数を使用することで、高価な初期化や、誰も聞いていないシグナルを発することを避けることができます。しかし、マルチスレッド・アプリケーションでは、この関数が返された後、シグナルが発せられる前に接続が変更される可能性があります。
警告 この関数は、オブジェクト指向のモジュール性の原則に違反しています。特に、この関数はconnectNotify() やdisconnectNotify() のオーバーライドから呼んではならない。
bool QObject::isWidgetType() const
オブジェクトがウィジェットの場合はtrue
を返し、そうでない場合はfalse
を返します。
この関数を呼び出すことは、inherits("QWidget")
を呼び出すことと同じですが、はるかに高速です。
bool QObject::isWindowType() const
オブジェクトがウィンドウの場合はtrue
を返し、そうでない場合はfalse
を返します。
この関数を呼び出すことは、inherits("QWindow")
を呼び出すことと同じです。
void QObject::killTimer(int id)
タイマー識別子id を持つタイマーを終了させます。
タイマー識別子は、タイマー・イベントが開始されたときにstartTimer() によって返される。
timerEvent() およびstartTimer()も参照してください 。
[since 6.8]
void QObject::killTimer(Qt::TimerId id)
これはオーバーロードされた関数です。
この関数は Qt 6.8 で導入されました。
[virtual]
const QMetaObject *QObject::metaObject() const
このオブジェクトのメタオブジェクトへのポインタを返します。
メタオブジェクトには、QObject を継承するクラスに関する情報(クラス名、スーパークラス名、プロパティ、シグナル、スロットなど)が含まれます。Q_OBJECT マクロを含むQObject サブクラスはすべてメタオブジェクトを持ちます。
メタオブジェクトの情報は、シグナル/スロット接続メカニズムとプロパティ・システムで必要とされます。inherits()関数もメタオブジェクトを利用します。
実際のオブジェクト・インスタンスへのポインタがない場合でも、クラスのメタ・オブジェクトにアクセスしたい場合は、staticMetaObject 。
例
QObject *obj = new QPushButton; obj->metaObject()->className(); // returns "QPushButton" QPushButton::staticMetaObject.className(); // returns "QPushButton"
staticMetaObjectも参照してください 。
bool QObject::moveToThread(QThread *targetThread)
このオブジェクトとその子のスレッド親和性を変更し、成功するとtrue
を返します。オブジェクトに親がある場合は移動できません。イベント処理はtargetThread で続行されます。
オブジェクトをメイン・スレッドに移動するには、QApplication::instance() を使用して現在のアプリケーションへのポインタを取得し、QApplication::thread() を使用してアプリケーションが存在するスレッドを取得します。例えば
myObject->moveToThread(QApplication::instance()->thread());
targetThread がnullptr
の場合、このオブジェクトとその子のイベント処理はすべて停止する。
オブジェクトのアクティブなタイマーはすべてリセットされることに注意してください。タイマーは、まず現在のスレッドで停止され、targetThread で(同じ間隔で)再開される。その結果、スレッド間でオブジェクトを常に移動させると、タイマーイベントが無期限に延期される可能性がある。
スレッド・アフィニティが変更される直前に、QEvent::ThreadChange イベントがこのオブジェクトに送られます。このイベントを処理することで、特別な処理を行うことができます。このオブジェクトにポストされる新しいイベントは、nullptr
でない限り、targetThread で処理されることに注意してください。nullptr
の場合、このオブジェクトやその子オブジェクトはどのスレッドにも関連付けられなくなるため、イベント処理を行うことはできません。
警告: 現在のスレッドは、現在のスレッド・アフィニティと同じでなければなりません。言い換えると、この関数は現在のスレッドから別のスレッドにオブジェクトを「プッシュ」することしかできず、任意のスレッドから現在のスレッドにオブジェクトを「プル」することはできません。スレッド親和性を持たないオブジェクトは、現在のスレッドに「プル」することができます。
thread()も参照のこと 。
[private signal]
void QObject::objectNameChanged(const QString &objectName)
このシグナルは、オブジェクトの名前が変更された後に発行される。新しいオブジェクト名はobjectName として渡される。
注意: これはプライベート・シグナルです。シグナル接続で使用することはできますが、ユーザーが発することはできません。
注: objectName プロパティに対するノーティファイア・シグナル。
QObject::objectNameも参照 。
QObject *QObject::parent() const
親オブジェクトへのポインタを返します。
setParent() およびchildren()も参照して ください。
QVariant QObject::property(const char *name) const
オブジェクトのname プロパティの値を返します。
そのようなプロパティが存在しない場合、返されるバリアントは無効です。
利用可能なすべてのプロパティに関する情報は、metaObject() およびdynamicPropertyNames() を通して提供されます。
setProperty()、QVariant::isValid()、metaObject()、dynamicPropertyNames()も参照して ください。
[protected]
int QObject::receivers(const char *signal) const
signal に接続されている受信機の数を返す。
スロットもシグナルもシグナルのレシーバーとして使用でき、同じ接続を何度も行うことができるため、レシーバーの数は、このシグナルから行われた接続の数と同じになります。
この関数を呼び出す際には、SIGNAL()
マクロを使用して特定のシグナルを渡すことができる:
if (receivers(SIGNAL(valueChanged(QByteArray))) > 0) { QByteArray data; get_the_value(&data); // expensive operation emit valueChanged(data); }
警告 警告:この関数は、オブジェクト指向の原則であるモジュール性に違反しています。しかし、あるシグナルに何かが接続されている場合にのみ、高価な初期化を行う必要がある場合には便利かもしれません。
isSignalConnected()も参照 。
void QObject::removeEventFilter(QObject *obj)
このオブジェクトからイベント・フィルター・オブジェクトobj を削除します。そのようなイベント・フィルターがインストールされていない場合、リクエストは無視されます。
このオブジェクトのすべてのイベント・フィルターは、このオブジェクトが破棄されるときに自動的に削除されます。
イベント・フィルタの起動中(つまりeventFilter() 関数から)であっても、イベント・フィルタを削除することは常に安全です。
installEventFilter()、eventFilter()、event()も参照 。
[protected]
QObject *QObject::sender() const
シグナルによって活性化されたスロットで呼び出された場合は、シグナルを送信したオブジェク トへのポインタを返します。そうでない場合は、nullptr
を返します。このポインタは、このオブジェクトのスレッドコンテキストからこの関数を呼び出したスロットの実行中にのみ有効です。
この関数が返すポインタは、送信者が破棄されたり、スロットが送信者のシグナルから切断されたりすると無効になります。
警告 この関数は、オブジェクト指向の原則であるモジュール性に違反しています。しかし、多くのシグナルが1つのスロットに接続されている場合、送信元へのアクセスは便利かもしれません。
警告 上述したように、このオブジェクトのスレッドとは異なるスレッドからQt::DirectConnection を介してスロットが呼び出された場合、この関数の戻り値は無効です。この種のシナリオではこの関数を使用しないでください。
senderSignalIndex()も参照してください 。
[protected]
int QObject::senderSignalIndex() const
現在実行中のスロットを呼び出したシグナルのメタメソッドインデックスを返します。このシグ ナルは、sender() によって返されたクラスのメンバです。シグナルによって起動されたスロットの外部で呼び出された場合は、-1 が返されます。
デフォルトのパラメータを持つシグナルの場合、この関数は、connect() で使用されたパラメータに関係なく、常にすべてのパラメータを持つインデックスを返します。例えば、シグナルdestroyed(QObject *obj = \nullptr)
は2つの異なるインデックス(パラメータ付きとパラメータなし)を持ちますが、この関数は常にパラメータ付きのインデックスを返します。これは、異なるパラメータを持つシグナルをオーバーロードする場合には適用されません。
警告 この関数は、オブジェクト指向の原則であるモジュール性に違反しています。しかし、シグナルインデックスへのアクセスは、1つのスロットに多くのシグナルが接続されている場合に便利です。
警告 このオブジェクトのスレッドとは異なるスレッドからQt::DirectConnection を介してスロットが呼び出された場合、この関数の戻り値は無効です。この種のシナリオではこの関数を使用しないでください。
sender()、QMetaObject::indexOfSignal()、QMetaObject::method()も参照 。
void QObject::setObjectName(const QString &name)
オブジェクトの名前をname に設定します。
注釈 objectName プロパティのセッター関数です。
objectName()も参照して ください。
[since 6.4]
void QObject::setObjectName(QAnyStringView name)
これはオーバーロードされた関数です。
注: プロパティobjectName のセッター関数です。
この関数は Qt 6.4 で導入されました。
void QObject::setParent(QObject *parent)
オブジェクトをparent の子にします。
parent() およびchildren()も参照してください 。
bool QObject::setProperty(const char *name, const QVariant &value)
オブジェクトのname プロパティの値をvalue に設定します。
そのプロパティがQ_PROPERTY を使用してクラスで定義されている場合は、成功時に true が返され、そうでない場合は false が返されます。プロパティがQ_PROPERTY を使用して定義されておらず、したがってメタ・オブジェクトにリストされていない場合は、動的プロパティとして追加され、false が返されます。
利用可能なすべてのプロパティに関する情報は、metaObject() とdynamicPropertyNames() を通して提供されます。
ダイナミック・プロパティは、property() を使用して再度クエリでき、プロパティ値を無効なQVariant に設定することで削除できます。ダイナミック・プロパティの値を変更すると、QDynamicPropertyChangeEvent がオブジェクトに送信されます。
注意:"_q_"で始まるダイナミック・プロパティは、内部用に予約されています。
property()、metaObject()、dynamicPropertyNames()、QMetaProperty::write()も参照 。
[since 6.6]
bool QObject::setProperty(const char *name, QVariant &&value)
この関数は setProperty をオーバーロードします。
この関数は Qt 6.6 で導入されました。
[noexcept]
bool QObject::signalsBlocked() const
シグナルがブロックされている場合はtrue
を返し、そうでない場合はfalse
を返します。
デフォルトではシグナルはブロックされません。
blockSignals() およびQSignalBlockerも参照してください 。
int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
これはオーバーロードされた関数で、timerType 型のタイマーを開始し、interval ミリ秒のタイムアウトを設定します。これは呼び出しと同じである:
startTimer(std::chrono::milliseconds{interval}, timerType);
timerEvent()、killTimer()、QChronoTimer 、およびQBasicTimerも参照 。
int QObject::startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer)
これはオーバーロードされた関数である。
タイマーを開始し、タイマー識別子を返すか、タイマーを開始できなかった場合はゼロを返します。
killTimer ()が呼び出されるまで、interval 毎にタイマー・イベントが発生する。interval がstd::chrono::duration::zero()
と等しい場合、処理すべきウィンドウ・システム・イベントがなくなるたびに、 タイマー・イベントが1回発生する。
仮想timerEvent ()関数は、タイマー・イベントが発生すると、QTimerEvent イベント・パラメーター・クラスで呼び出されます。タイマー・イベントを取得するには、この関数を再実装します。
複数のタイマーが動作している場合、QTimerEvent::id() メソッドを使用して、どのタイマーが起動されたかを調べることができます。
例
class MyObject : public QObject { Q_OBJECT public: MyObject(QObject *parent = nullptr); protected: void timerEvent(QTimerEvent *event) override; }; MyObject::MyObject(QObject *parent) : QObject(parent) { using namespace std::chrono_literals; startTimer(50ms); startTimer(5s); startTimer(10min); startTimer(1h); } void MyObject::timerEvent(QTimerEvent *event) { qDebug() << "Timer ID:" << event->id(); }
タイマーの精度は、基盤となるオペレーティング・システムとハードウェアに依存することに注意してください。
引数timerType 、タイマーの精度をカスタマイズできる。タイマーの種類についてはQt::TimerType を参照のこと。ほとんどのプラットフォームは20ミリ秒の精度をサポートしています。Qt は、要求された数のタイマー・イベントを提供できない場合、いくつかのイベントを静かに破棄します。
QTimer とQChronoTimer クラスは、イベントの代わりにシングルショットタイマーとタイマーシグナルを使用した高レベルプログラミングインターフェイスを提供します。また、QChronoTimer よりも軽量ですが、タイマー ID を直接使用するよりも扱いにくいQBasicTimer クラスもあります。
std::chrono::milliseconds
注: Qt 6.8 からinterval のタイプはstd::chrono::nanoseconds
になりました。
注意 : Qt 6.8 では、QObject はタイマー ID を表すためにQt::TimerId を使うように変更されました。このメソッドは後方互換性のために TimerId を int に変換しますが、例えばこのメソッドから返される値をチェックするためにQt::TimerId を使用することができます:
QObject *obj; ... const auto id = Qt::TimerId{obj->startTimer(100ms)}; if (id != Qt::TimerId::Invalid) // The timer has been started successfully
timerEvent()、killTimer()、QChronoTimer 、QBasicTimerも参照 。
QThread *QObject::thread() const
オブジェクトが存在するスレッドを返します。
moveToThread() も参照 。
[virtual protected]
void QObject::timerEvent(QTimerEvent *event)
このイベント・ハンドラをサブクラスで再実装して、オブジェクトのタイマー・イベントを受け取ることができます。
QChronoTimer は、タイマー機能へのより高いレベルのインタフェースと、タイマーに関するより一般的な情報を提供します。タイマー・イベントは パラメータで渡されます。event
startTimer()、killTimer()、event()も参照 。
[static]
QString QObject::tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)
disambiguation の文字列と、複数形を含む文字列の場合はn の値に基づいて、sourceText の翻訳バージョンを返します。適切な翻訳文字列がない場合は、QString::fromUtf8(sourceText) を返します。
例
void SpreadSheet::setupMenuBar() { QMenu *fileMenu = menuBar()->addMenu(tr("&File")); ...
例: 同じsourceText が同じコンテキスト内で異なる役割で使用される場合、追加の識別文字列をdisambiguation ( デフォルトではnullptr
) で渡すことができる。
例
MyWindow::MyWindow() { QLabel *senderLabel = new QLabel(tr("Name:")); QLabel *recipientLabel = new QLabel(tr("Name:", "recipient")); ...
Qt の翻訳メカニズム全般に関する詳細な説明については「翻訳用ソースコードの記述」を、曖昧性解消に関する情報については「同一テキストの曖昧性解消」を参照してください。
警告 このメソッドがリエントラントになるのは、このメソッドを呼び出す前にすべてのトランスレータがインストールされている場合のみです。翻訳の実行中にトランスレータをインストールしたり削除したりすることはサポートされていません。これを行うと、おそらくクラッシュやその他の望ましくない動作が発生します。
QCoreApplication::translate() およびInternationalization with Qtも参照してください 。
メンバ変数 ドキュメント
const QMetaObject QObject::staticMetaObject
この変数は、クラスのメタオブジェクトを格納します。
メタオブジェクトには、QObject を継承するクラスに関する情報(クラス名、スーパークラス名、プロパティ、シグナル、スロットなど)が格納されます。Q_OBJECT マクロを含むすべてのクラスもメタオブジェクトを持ちます。
メタ・オブジェクトの情報は、シグナル/スロット接続機構とプロパティ・システムで必要とされます。inherits ()関数もメタオブジェクトを利用します。
オブジェクトへのポインタがあれば、metaObject ()を使用して、そのオブジェクトに関連付けられたメタ・オブジェクトを取得することができます。
例
QPushButton::staticMetaObject.className(); // returns "QPushButton" QObject *obj = new QPushButton; obj->metaObject()->className(); // returns "QPushButton"
metaObject()も参照のこと 。
関連する非メンバー
template <typename T> T qobject_cast(QObject *object)
template <typename T> T qobject_cast(const QObject *object)
オブジェクトが T 型(またはサブクラス)である場合、与えられたobject を T 型にキャストして返します。そうでない場合はnullptr
を返します。object がnullptr
の場合はnullptr
も返します。
クラスTは(直接的または間接的に)QObject を継承し、Q_OBJECT マクロで宣言されていなければなりません。
クラスはそれ自身を継承するとみなされます。
例
QObject *obj = new QTimer; // QTimer inherits QObject QTimer *timer = qobject_cast<QTimer *>(obj); // timer == (QObject *)obj QAbstractButton *button = qobject_cast<QAbstractButton *>(obj); // button == nullptr
例:qobject_cast()関数は、標準のC++dynamic_cast()
と同様の動作をしますが、RTTIサポートを必要とせず、ダイナミック・ライブラリの境界を越えて動作するという利点があります。
qobject_cast() はインターフェースと組み合わせて使用することもできます。
警告 T がQ_OBJECT マクロで宣言されていない場合、この関数の戻り値は未定義である。
QObject::inherits()も参照のこと 。
QObjectList
マクロ・ドキュメント
[since 6.7]
QT_NO_CONTEXTLESS_CONNECT
このマクロを定義すると、シグナルをファンクタに接続するQObject::connect() のオーバーロードが、レシーバ/コンテキスト・オブジェクトとしてQObject を指定することなく無効になる(つまり、QObject::connect() の 3-arguments オーバーロード)。
なぜなら、受信側のローカル状態に依存するファンクタに接続しやすいからです。そのようなローカル状態が破壊されても、接続は自動的に切断されない。
さらに、このような接続は常に直接接続であるため、マルチスレッドシナリオで問題が発生する可能性があります(例えば、シグナルが別のスレッドから発信された場合など)。
このマクロは Qt 6.7 で導入されました。
QObject::connect とQt::ConnectionTypeも参照してください 。
QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
このマクロを定義すると、シグナルとスロットが PMF ベースの構文で接続されている場合に、シグナルが持つ引数とスロットが受け付ける引数の間の狭義化と浮動小数点から整数への変換が無効になります。
QObject::connectも参照してください 。
Q_CLASSINFO(Name, Value)
このマクロは、QObject::metaObject() を使用して利用可能な追加情報をクラスに関連付けます。追加情報はName 文字列とValue リテラル文字列の形式をとります。
例
class MyClass : public QObject { Q_OBJECT Q_CLASSINFO("Author", "Pierre Gendron") Q_CLASSINFO("URL", "http://www.my-organization.qc.ca") public: ... };
Qt では、Qt D-BusとQt Qmlモジュールでこのマクロを使用しています。例えば、C++でQMLオブジェクトタイプを定義する際に、プロパティをデフォルトのものとして指定することができます:
Q_CLASSINFO("DefaultProperty", "content")
QMetaObject::classInfo()、Qt D-Bus アダプタの使用、C++ からの QML 型の定義も参照してください 。
Q_EMIT
Qt Signals and Slots をサードパーティのシグナル/スロット機構で使用したい場合、シグナルを発するためのemit
キーワードを置き換えるためにこのマクロを使用します。
このマクロは通常、.pro
ファイル内の変数CONFIG
でno_keywords
が指定されている場合に使用しますが、no_keywords
が指定されていない場合でも使用できます。
Q_ENUM(...)
このマクロはenum型をメタオブジェクトシステムに登録する。このマクロは、Q_OBJECT 、Q_GADGET またはQ_GADGET_EXPORT マクロを持つクラスの enum 宣言の後に配置する必要があります。名前空間の場合は、代わりにQ_ENUM_NS() を使用してください。
例えば
class MyClass : public QObject { Q_OBJECT public: MyClass(QObject *parent = nullptr); ~MyClass(); enum Priority { High, Low, VeryHigh, VeryLow }; Q_ENUM(Priority) void setPriority(Priority priority); Priority priority() const; };
Q_ENUM で宣言された列挙は、QMetaEnum がQMetaObject に登録されます。QMetaEnum を取得するにはQMetaEnum::fromType() を使用することもできます。
登録された列挙型は自動的に Qt メタ型システムにも登録され、Q_DECLARE_METATYPE() を使わなくても、QMetaType に知られるようになります。これにより、便利な機能が利用できるようになります。例えば、QVariant で使用する場合、文字列に変換することができます。同様に、QDebug に渡すと、その名前が出力される。
列挙型の値は、メタ・オブジェクト・システムに符号付きint
として格納されることに注意してください。int
で有効な値の範囲外の値を列挙型に登録すると、メタオブジェクトシステ ムを通して列挙型にアクセスする際にオーバーフローや未定義の動作が発生する可能性があ ります。例えばQMLでは、登録された列挙型にメタオブジェクトシステムを通してアクセスします。
Qtのプロパティシステムも参照してください 。
Q_ENUM_NS(...)
このマクロは列挙型をメタオブジェクトシステムに登録します。このマクロは、Q_NAMESPACE マクロを持つ名前空間の enum 宣言の後に配置する必要があります。これはQ_ENUM と同じですが、名前空間内にあります。
Q_ENUM_NS で宣言された列挙は、QMetaEnum がQMetaObject で囲まれて登録されます。QMetaEnum を取得するにはQMetaEnum::fromType() を使用することもできます。
登録された列挙型は自動的に Qt メタ型システムにも登録され、Q_DECLARE_METATYPE() を使わなくても、QMetaType に登録されます。これにより、便利な機能が利用できるようになります。例えば、QVariant で使用する場合、文字列に変換することができます。同様に、QDebug に渡すと、その名前が出力される。
列挙型の値は、メタ・オブジェクト・システムに符号付きint
として格納されることに注意してください。int
で有効な値の範囲外の値を列挙型に登録すると、メタオブジェクトシステ ムを通して列挙型にアクセスする際にオーバーフローや未定義の動作が発生する可能性があ ります。例えばQMLでは、登録された列挙型にメタオブジェクトシステムを通してアクセスします。
Qtのプロパティシステムも参照してください 。
Q_FLAG(...)
このマクロはflags type を1つだけメタオブジェクトシステムに登録します。このマクロは通常クラス定義で使用され、与えられた列挙型の値をフラグとして使用し、ビット OR 演算子を使用して結合できることを宣言します。名前空間では、代わりにQ_FLAG_NS() を使用します。
マクロは列挙型の宣言の後に置かなければなりません。フラグ型の宣言は、Q_DECLARE_FLAGS() マクロを使用して行われる。
例えば、QItemSelectionModel において、SelectionFlags フラグは以下のように宣言される:
class QItemSelectionModel : public QObject { Q_OBJECT public: ... enum SelectionFlag { NoUpdate = 0x0000, Clear = 0x0001, Select = 0x0002, Deselect = 0x0004, Toggle = 0x0008, Current = 0x0010, Rows = 0x0020, Columns = 0x0040, SelectCurrent = Select | Current, ToggleCurrent = Toggle | Current, ClearAndSelect = Clear | Select }; Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag) Q_FLAG(SelectionFlags) ... }
注: Q_FLAG マクロは、メタ・オブジェクト・システムに個々のフラグ値を登録する処理を行うので、このマクロに加えてQ_ENUM() を使用する必要はありません。
Qt のプロパティ・システムも参照してください 。
Q_FLAG_NS(...)
このマクロは、単一のflags type をメタオブジェクトシステムに登録します。これは、Q_NAMESPACE マクロを持つ名前空間で使用され、与えられた列挙型の値をフラグとして使用し、ビット OR 演算子を使用して結合できることを宣言します。これはQ_FLAG と同じですが、名前空間内にあります。
マクロはenum宣言の後に置かなければなりません。
注意: Q_FLAG_NS マクロは、個々のフラグ値をメタ・オブジェクト・システムに登録する処理を行うので、このマクロに加えてQ_ENUM_NS() を使用する必要はありません。
Qt のプロパティシステムも参照してください 。
Q_GADGET
Q_GADGET マクロは、QObject を継承しないが、QMetaObject が提供するリフレクション機能の一部を使用したいクラスのための、Q_OBJECT マクロの軽量版です。
注意: このマクロ展開はprivate
: アクセス指定子で終わります。このマクロの直後にメンバを宣言すると、それらのメンバもプライベートになります。マクロの直後にパブリック(またはプロテクト)メンバを追加するには、public:
(またはprotected:
)アクセス指定子を使用します。
Q_GADGET はQ_ENUM 、Q_PROPERTY 、Q_INVOKABLE を持つことができますが、シグナルやスロットを持つことはできません。
staticMetaObject
staticMetaObject
は 型で、 で宣言された列挙型へのアクセスを提供します。QMetaObject Q_ENUM
Q_GADGET_EXPORTも参照してください 。
[since 6.3]
Q_GADGET_EXPORT(EXPORT_MACRO)
Q_GADGET_EXPORT マクロはQ_GADGET マクロとまったく同じように動作します。ただし、staticMetaObject
変数(Q_GADGET を参照)は、EXPORT_MACRO 修飾子で宣言されます。これは、オブジェクトをダイナミック・ライブラリからエクスポートする必要があるが、包含するクラス全体としてはエクスポートすべきではない場合に便利です(ほとんどがインライン関数で構成されている場合など)。
注意: このマクロ展開はprivate
: アクセス指定子で終わります。このマクロの直後にメンバを宣言すると、それらのメンバもprivateになります。マクロの直後にパブリック(またはプロテクト)メンバーを追加するには、public:
(またはprotected:
)アクセス指定子を使用します。
例えば
class Point { Q_GADGET_EXPORT(EXPORT_MACRO) Q_PROPERTY(int x MEMBER x) Q_PROPERTY(int y MEMBER y) ~~~
このマクロは Qt 6.3 で導入されました。
Q_GADGET と共有ライブラリの作成も参照してください 。
Q_INTERFACES(...)
このマクロは、クラスがどのインターフェースを実装しているかを Qt に伝えます。プラグインを実装するときに使用します。
Q_DECLARE_INTERFACE()、Q_PLUGIN_METADATA()、Qt プラグインの作成方法も参照して ください。
Q_INVOKABLE
このマクロをメンバ関数の宣言に適用することで、メタオブジェクトシステム経由で呼び出すことができるようになります。次の例に示すように、マクロは戻り値の型の前に記述します:
class Window : public QWidget { Q_OBJECT public: Window(); void normalMethod(); Q_INVOKABLE void invokableMethod(); };
invokableMethod()
関数はQ_INVOKABLEでマークアップされ、メタ・オブジェクト・システムに登録され、QMetaObject::invokeMethod ()を使って呼び出すことができます。normalMethod()
関数はこのように登録されていないため、QMetaObject::invokeMethod() を使用して呼び出すことはできません。
呼び出し可能なメンバ関数がQObject またはQObject のサブクラスへのポインタを返し、それが QML から呼び出される場合、特別な所有権ルールが適用されます。詳しくはQMLとC++間のデータ型変換を参照してください。
[since 6.0]
Q_MOC_INCLUDE
Q_MOC_INCLUDEマクロはクラス内でもクラス外でも使用でき、メタオブジェクトコンパイラにインクルードを追加するように指示します。
// Put this in your code and the generated code will include this header. Q_MOC_INCLUDE("myheader.h")
これは、プロパティやシグナル/スロットの引数として使用する型が前方宣言されている場合に便利です。
このマクロは Qt 6.0 で導入されました。
Q_NAMESPACE
Q_NAMESPACE マクロを使用して、名前空間にQMetaObject 機能を追加できます。
Q_NAMESPACE はQ_CLASSINFO,Q_ENUM_NS,Q_FLAG_NS を持つことができますが、Q_ENUM,Q_FLAG,Q_PROPERTY,Q_INVOKABLE, シグナルやスロットを持つことはできません。
Q_NAMESPACE は外部変数staticMetaObject
を使用可能にします。staticMetaObject
はQMetaObject 型で、Q_ENUM_NS/Q_FLAG_NS で宣言された列挙型へのアクセスを提供します。
例えば
namespace test { Q_NAMESPACE ...
Q_NAMESPACE_EXPORTも参照してください 。
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
Q_NAMESPACE_EXPORT マクロを使用して、ネームスペースにQMetaObject 機能を追加できます。
これはQ_NAMESPACE マクロとまったく同じように動作します。ただし、名前空間で定義される外部変数staticMetaObject
は、指定されたEXPORT_MACRO 修飾子で宣言されます。これは、オブジェクトをダイナミック・ライブラリからエクスポートする必要がある場合に便利です。
例えば
namespace test { Q_NAMESPACE_EXPORT(EXPORT_MACRO) ...
Q_NAMESPACE および共有ライブラリの作成も参照してください 。
Q_OBJECT
Q_OBJECT マクロは、動的プロパティ、シグナル、スロットなどのメタオブジェクト機能を有効にするために使用します。
Q_OBJECT マクロは、独自のシグナルやスロットを宣言したり、Qt のメタオブジェクト・システムが提供する他のサービスを使用するクラス定義の任意のセクションに追加できます。
注意: このマクロ展開はprivate
: アクセス指定子で終わります。このマクロの直後にメンバを宣言すると、それらのメンバもプライベートになります。マクロの直後にパブリック(またはプロテクト)メンバを追加するには、public:
(またはprotected:
)アクセス指定子を使用します。
例
#include <QObject> class Counter : public QObject { Q_OBJECT // Note. The Q_OBJECT macro starts a private section. // To declare public members, use the 'public:' access modifier. public: Counter() { m_value = 0; } int value() const { return m_value; } public slots: void setValue(int value); signals: void valueChanged(int newValue); private: int m_value; };
注: このマクロを使用するには、クラスがQObject のサブクラスである必要があります。QObject のサブクラスでないクラスでメタ・オブジェクト・システムによる列挙型のサポートを有効にするには、Q_OBJECT の代わりにQ_GADGET またはQ_GADGET_EXPORT を使用してください。
メタオブジェクトシステム、シグナルとスロット、Qt のプロパティシステムも参照してください 。
Q_PROPERTY(...)
このマクロは、QObject を継承するクラスでプロパティを宣言するために使用します。プロパティはクラス・データ・メンバーのように振る舞いますが、メタ・オブジェクト・システムを通してアクセスできる追加機能を持っています。
Q_PROPERTY(type name (READ getFunction [WRITE setFunction] | MEMBER memberName [(READ getFunction | WRITE setFunction)]) [RESET resetFunction] [NOTIFY notifySignal] [REVISION int | REVISION(int[, int])] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [BINDABLE bindableProperty] [CONSTANT] [FINAL] [REQUIRED])
プロパティ名と型、READ
関数が必要です。型は、QVariant でサポートされている任意の型でも、ユーザー定義型でもかまいません。他の項目は任意ですが、WRITE
関数が一般的です。USER
以外の属性はデフォルトでtrueになり、falseになります。
例えば
Q_PROPERTY(QString title READ title WRITE setTitle USER true)
このマクロの使い方の詳細と、より詳細な使用例については、QtのProperty Systemの議論を参照してください。
Qt's Property System」も参照して ください。
Q_REVISION
このマクロをメンバ関数の宣言に適用すると、メタオブジェクトシステムのリビジョン番号でタグ付けされます。このマクロは、次の例に示すように、戻り値の型の前に記述します:
class Window : public QWidget { Q_OBJECT Q_PROPERTY(int normalProperty READ normalProperty) Q_PROPERTY(int newProperty READ newProperty REVISION(2, 1)) public: Window(); int normalProperty(); int newProperty(); public slots: void normalMethod(); Q_REVISION(2, 1) void newMethod(); };
これは、メタ・オブジェクト・システムを使ってオブジェクトを別のAPIに動的に公開する場合に便利です。次の単純化した例を考えてみましょう:
Window window; int expectedRevision = 0; const QMetaObject *windowMetaObject = window.metaObject(); for (int i=0; i < windowMetaObject->methodCount(); i++) if (windowMetaObject->method(i).revision() <= expectedRevision) exposeMethod(windowMetaObject->method(i)); for (int i=0; i < windowMetaObject->propertyCount(); i++) if (windowMetaObject->property(i).revision() <= expectedRevision) exposeProperty(windowMetaObject->property(i));
前の例と同じ Window クラスを使用すると、newProperty と newMethod は、期待されるバージョンが2.1
以上の場合にのみこのコードで公開されます。
すべてのメソッドはタグ付けされていない場合、リビジョン0
にあるとみなされるため、Q_REVISION(0)
またはQ_REVISION(0, 0)
のタグは無効で無視されます。
Q_REVISION
には、1つまたは2つの整数パラメータを渡すことができる。 1つのパラメータを渡した場合、それはマイナーバージョンのみを示す。つまり、メジャーバージョンは指定されない。2つのパラメータを渡す場合、最初のパラメータがメジャーバージョン、 2番目のパラメータがマイナーバージョンとなる。
このタグはメタオブジェクトシステム自体では使用されません。現在のところ、QtQml モジュールでのみ使用されています。
より汎用的な文字列タグについては、QMetaMethod::tag() を参照のこと。
QMetaMethod::revision()も参照のこと 。
Q_SET_OBJECT_NAME(Object)
このマクロは、Object にobjectName "オブジェクト "を割り当てる。
Object がポインタであるかどうかは関係なく、マクロが勝手に判断する。
QObject::objectName() も参照の こと。
Q_SIGNAL
これは、1つの関数をシグナルとしてマークできる追加マクロです。特に、signals
やQ_SIGNALS
グループを理解しないサードパーティーのソースコード・パーサーを使用する場合に、非常に便利です。
Qt Signals and Slots をサードパーティのシグナル/スロット機構で使用したい場合、クラス宣言のsignals
キーワードを置き換えるためにこのマクロを使用します。
このマクロは通常、.pro
ファイル内の変数CONFIG
でno_keywords
が指定されている場合に使用しますが、no_keywords
が指定されていない場合でも使用できます。
Q_SIGNALS
このマクロは、Qt Signals and Slots をサードパーティのシグナル/スロット機構で使用したい場合に、クラス宣言のsignals
キーワードを置き換えるために使用します。
このマクロは通常、.pro
ファイル内の変数CONFIG
でno_keywords
が指定されている場合に使用しますが、no_keywords
が指定されていない場合でも使用できます。
Q_SLOT
これは、1つの関数をスロットとしてマークできる追加マクロです。特に、slots
またはQ_SLOTS
グループを理解しないサードパーティーのソースコード・パーサーを使用する場合、非常に便利です。
Qt Signals and Slots をサードパーティのシグナル/スロット機構で使用したい場合、クラス宣言のslots
キーワードを置き換えるためにこのマクロを使用します。
このマクロは通常、.pro
ファイル内の変数CONFIG
でno_keywords
が指定されている場合に使用しますが、no_keywords
が指定されていない場合でも使用できます。
Q_SLOTS
このマクロは、Qt Signals and Slots をサードパーティのシグナル/スロット機構で使用したい場合に、クラス宣言のslots
キーワードを置き換えるために使用します。
このマクロは通常、.pro
ファイル内の変数CONFIG
でno_keywords
が指定されている場合に使用しますが、no_keywords
が指定されていない場合でも使用できます。
本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。