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)
- 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 char *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.11) bool | isQmlExposed() const |
(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) |
(since 6.12) bool | disconnect(QMetaObject::Connection &connection) |
(since 6.12) bool | disconnect(QMetaObject::Connection &&connection) |
| 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) |
protected関数
| 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 | |
(since 6.8) enum class | TimerId { Invalid } |
| T | qobject_cast(QObject *object) |
| T | qobject_cast(const QObject *object) |
マクロ
(since 6.7) | QT_NO_CONTEXTLESS_CONNECT |
(since 6.12) | QT_NO_DISCONNECT_CONST_CONNECTION |
| 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 マクロの使用が必須である点に注意してください。また、ソースファイルに対してMeta-Object Compilerを実行する必要があります。 実際にシグナル、スロット、プロパティを使用しているかどうかに関わらず、QObjectのすべてのサブクラスでこのマクロを使用することを強く推奨します。そうしないと、特定の関数が予期しない動作を示す可能性があるためです。
QWidget すべての Qt Widgets は QObject を継承しています。利便性向上のための関数isWidgetType() は、オブジェクトが実際にウィジェットであるかどうかを返します。これは、qobject_cast<XML-ph-0002@deepl.internal*>(obj) やobj->inherits("QWidget") よりもはるかに高速です。
children() など、一部の QObject 関数はQObjectList を返します。QObjectList はQList<QObject *> の typedef です。
スレッドアフィニティ
QObjectのインスタンスにはスレッドアフィニティがある、あるいは特定のスレッドに存在すると表現されます。QObjectがqueued signal や投稿されたイベントを受信した場合、そのスロットまたはイベントハンドラは、そのオブジェクトが存在するスレッドで実行されます。
注: QObjectにスレッドアフィニティがない場合 (つまり、thread()が0を返す場合)、またはそのオブジェクトが存在するスレッドでイベントループが実行されていない場合、そのオブジェクトはキューに入れられたシグナルや投稿されたイベントを受信することはできません。
デフォルトでは、QObject はその作成されたスレッドに存在します。オブジェクトのスレッドアフィニティは、thread() を使用して照会し、moveToThread() を使用して変更することができます。
すべての QObject は、その親と同じスレッドに存在しなければなりません。したがって:
- setParent関数 () は、対象となる 2 つの QObject が異なるスレッドに存在する場合、失敗します。
- QObjectが別のスレッドに移動されると、そのすべての子オブジェクトも自動的に移動されます。
- moveToThreadQObjectに親が存在する場合、()は失敗します。
- QThread::run() 内で QObject が作成された場合、QThread はQThread::run() を呼び出すスレッドには存在しないため、その QObject はQThread オブジェクトの子になることはできません。
注:QObjectのメンバ変数は 、自動的にその子オブジェクトにはなりません。親子関係は、子オブジェクトのconstructor へのポインタを渡すか、setParent()を呼び出すことによって設定する必要があります。この手順を行わない場合、moveToThread()が呼び出された際、オブジェクトのメンバ変数は元のスレッドに残ったままになります。
コピーコンストラクタや代入演算子は存在しない
QObjectには、コピーコンストラクタも代入演算子もありません。これは設計上の仕様です。 実際には、これらは宣言されていますが、マクロQ_DISABLE_COPY() を使用したprivate セクション内にあります。実際、QObject から(直接的または間接的に)派生したすべての Qt クラスは、このマクロを使用して、コピーコンストラクタと代入演算子を private として宣言しています。その理由については、Qtオブジェクトモデルのページにある「Identity vs Value」に関する説明を参照してください。
主な影響として、本来ならQObjectのサブクラスを値として使いたくなるような場面でも、QObject(またはそのサブクラス)へのポインタを使用する必要があります。例えば、コピーコンストラクタがないと、QObjectのサブクラスをコンテナクラスの一つに格納する値として使用することはできません。 必ずポインタを格納する必要があります。
自動接続
Qtのメタオブジェクトシステムは、QObjectのサブクラスとその子クラス間でシグナルとスロットを自動的に接続する仕組みを提供しています。オブジェクトが適切なオブジェクト名で定義され、スロットが単純な命名規則に従っている限り、この接続はQMetaObject::connectSlotsByName()関数によって実行時に実行されます。
uicは、この関数を呼び出すコードを生成し、 Qt Widgets Designer。自動接続の使用に関する詳細については Qt Widgets Designer Qt Widgets Designer に関する詳細は、 Qt Widgets Designer マニュアルの「アプリケーションでの xml-ph-0000@deepl.internal UI ファイルの使用」セクションに記載されています。
動的プロパティ
動的プロパティは、実行時に QObject インスタンスに対して追加・削除することができます。動的プロパティはコンパイル時に宣言する必要はありませんが、静的プロパティと同じ利点があり、同じ API を使用して操作できます。つまり、property() を使用して読み取り、setProperty() を使用して書き込みを行います。
動的プロパティは Qt Widgets Designerでサポートされており、標準のQt Widgetsとユーザー作成のフォームの両方に動的プロパティを付与することができます。
国際化 (I18n)
すべての QObject サブクラスは Qt の翻訳機能をサポートしており、アプリケーションのユーザーインターフェースをさまざまな言語に翻訳することが可能になります。
ユーザーに表示されるテキストを翻訳可能にするには、そのテキストをtr()関数の呼び出しで囲む必要があります。これについては、「翻訳用のソースコードの記述」というドキュメントで詳しく説明されています。
QMetaObject 、QPointer 、QObjectCleanupHandler 、Q_DISABLE_COPY()、および「オブジェクトツリーと所有権」も参照してください 。
プロパティのドキュメント
[bindable] objectName : QString
注:この プロパティは、QProperty のバインディングに対応しています。
このプロパティには、このオブジェクトの名前が格納されます。
findChild() を使用すると、名前(および型)でオブジェクトを検索できます。findChildren() を使用すると、一連のオブジェクトを検索できます。
qDebug("MyClass::setPrecision(): (%s) 無効な精度 %f",
qPrintable(objectName()), newPrecision);デフォルトでは、このプロパティには空の文字列が格納されています。
アクセス関数:
| QString | objectName() const |
| void | setObjectName(const QString &name) |
| void | setObjectName(QAnyStringView name) |
Notifier シグナル:
| void | objectNameChanged(const QString &objectName) | [see note below] |
注: これは プライベートシグナルです。シグナル接続では使用できますが、ユーザーが発信することはできません。
関連項目: 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 がfalseの場合、そのようなブロックは発生しません。
戻り値は、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状態の子ウィジェットが追加されたときにウィジェットに送信されます。子ウィジェットのpolishedイベントを受信した場合、通常はその子ウィジェットの構築は完了しています。ただし、これは保証されるものではなく、ウィジェットのコンストラクタの実行中に複数のpolishedイベントが配信される可能性があります。
子ウィジェットごとに、1つのChildAdded イベント、0個以上のChildPolished イベント、および1つのChildRemoved イベントを受信します。
子ウィジェットが追加された直後に削除された場合、ChildPolished イベントは発生しません。構築および破棄の過程で子ウィジェットが複数回ポリッシュ処理された場合、同じ子ウィジェットに対して複数のchild polishedイベントが受信される可能性があり、その都度異なる仮想テーブルが使用されます。
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 にある指定されたtype と、receiver オブジェクト内のmethod との接続を作成します。後で接続を切断するために使用できる、その接続へのハンドルを返します。
signal およびmethod を指定する際は、SIGNAL() およびSLOT() マクロを使用する必要があります。例:
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
label, SLOT(setNum(int)));この例では、ラベルに常に現在のスクロールバーの値が表示されるようにしています。シグナルおよびスロットのパラメータには変数名を含めてはならず、型のみを指定する必要がある点に注意してください。例えば、以下のように指定すると動作せず、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つのシグナルは、複数のスロットやシグナルに接続できます。また、1つのスロットには複数のシグナルを接続できます。
シグナルが複数のスロットに接続されている場合、シグナルが発信されると、接続が行われた順序と同じ順序でスロットがアクティブ化されます。
この関数は、シグナルとスロットの接続に成功した場合、接続へのハンドルを表す `QMetaObject::Connection ` を返します。接続を作成できない場合(例えば、QObject が `signal ` または `method` のいずれかの存在を確認できない場合、あるいはそれらのシグネチャが互換性がない場合など)、接続ハンドルは無効になります。ハンドルを `bool` にキャストすることで、その有効性を確認できます。
デフォルトでは、接続を確立するたびに 1 つのシグナルが発行され、重複する接続がある場合は 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)
sender オブジェクト内のsignal からfunctor への接続を作成し、その接続へのハンドルを返します
シグナルは、ヘッダー内でシグナルとして宣言された関数でなければなりません。スロット関数は、そのシグナルに接続可能な任意の関数またはファンクタです。スロット関数は、そのシグナルの引数の数がスロット関数の引数の数以上である場合に、そのシグナルに接続できます。シグナルとスロットの対応する引数の型間には、暗黙の変換が存在する必要があります。
例:
void someFunction();
//...
void someOtherFunction()
{
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 を利用して解決できます。
この関数は、QObject::connect() をオーバーロードしています。
注: この関数はスレッドセーフです。
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
sender オブジェクトのsignal を、このオブジェクトのmethod に接続します。
connect(sender,signal,this,method,type) と同等です。
接続を確立するたびにシグナルが1つ発信されるため、重複した接続では2つのシグナルが発信されます。disconnect() を使用して接続を切断できます。
この関数は、QObject::connect() をオーバーロードしています。
注: この関数はスレッドセーフです。
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)
sender オブジェクト内のsignal から、指定されたtype をfunctor に接続し、context の特定のイベントループに配置するとともに、その接続へのハンドルを返します。
注: Qt ::UniqueConnections は、ラムダ式、非メンバ関数、およびファンクタでは機能しません。これらはメンバ関数への接続にのみ適用されます。
シグナルは、ヘッダー内でシグナルとして宣言された関数でなければなりません。スロット関数は、そのシグナルに接続可能な任意の関数またはファンクタで構いません。スロット関数は、シグナルの引数の数がスロット関数の引数の数以上である場合に、そのシグナルに接続できます。また、シグナルとスロットの対応する引数の型間には、暗黙の変換が存在する必要があります。
例:
void someFunction();
//...
void someOtherFunction()
{
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 を使用して解決できます。
この関数はQObject::connect()をオーバーロードします。
注: この関数はスレッドセーフです。
[static] template <typename PointerToMemberFunction> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
sender オブジェクト内のsignal から、receiver オブジェクト内のmethod への、指定されたtype の接続を作成します。後で接続を解除するために使用できる、その接続へのハンドルを返します。
シグナルは、ヘッダー内でシグナルとして宣言された関数でなければなりません。スロット関数は、そのシグナルに接続可能な任意のメンバ関数です。スロットは、シグナルの引数の数がスロットの引数の数以上であり、かつシグナルとスロットの対応する引数の型間に暗黙の変換が存在する場合に、そのシグナルに接続できます。
例:
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);この例では、ラベルに常に現在のラインエディットのテキストが表示されるようにしています。
1つのシグナルは、複数のスロットやシグナルに接続できます。また、1つのスロットには複数のシグナルを接続できます。
シグナルが複数のスロットに接続されている場合、シグナルが発行された際、スロットは接続が行われた順序と同じ順序でアクティブ化されます。
この関数は、シグナルとスロットの接続に成功した場合、その接続へのハンドルを返します。接続を作成できない場合(例えば、QObject がsignal の存在を確認できない場合など)、接続ハンドルは無効になります( がシグナルとして宣言されていない場合)。QMetaObject::Connection が有効かどうかは、それをbool型にキャストすることで確認できます。
デフォルトでは、接続を確立するたびにシグナルが1つ発信され、重複した接続がある場合は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 の助けを借りて解決できます。
この関数は、QObject::connect() をオーバーロードします。
注: この関数はスレッドセーフです。
「文字列ベースの接続とファンクタベースの接続の違い」も参照してください 。
[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 列挙型のQEvent::User 項目以上の型値を持つユーザー定義のイベントであり、通常はQEvent のサブクラスです。イベントはevent パラメータを通じて渡されます。
[slot] void QObject::deleteLater()
このオブジェクトの削除をスケジュールします。
オブジェクトは、制御がイベントループに戻った時点で削除されます。この関数が呼び出された時点でイベントループが実行されていない場合(例:QCoreApplication::exec() の前に deleteLater() がオブジェクトに対して呼び出された場合)、オブジェクトはイベントループが開始された時点で削除されます。 メインのイベントループが停止した後に deleteLater() が呼び出された場合、オブジェクトは削除されません。イベントループが実行されていないスレッド内に存在するオブジェクトに対して deleteLater() が呼び出された場合、そのオブジェクトはスレッドが終了した時点で破棄されます。
QThread 内でワーカーQObject を使用する際の一般的なパターンとして、スレッドのfinished() シグナルをワーカーのdeleteLater() スロットに接続し、安全に削除されるようにすることが挙げられます:
新しいイベントループへの進入および退出(例:モーダルダイアログの表示)では、遅延削除は実行されないことに注意してください。オブジェクトを削除するには、deleteLater() が呼び出された元のイベントループへ制御が戻る必要があります。 これは、以前のネストされたイベントループがまだ実行中の間に削除されたオブジェクトには適用されません。Qtのイベントループは、新しいネストされたイベントループが開始されるやいなや、それらのオブジェクトを削除します。
QCoreApplication::exec() やQEventLoop::exec() などを通じて Qt がイベントディスパッチャを制御していない状況では、遅延削除は自動的に処理されません。このシナリオで遅延削除を確実に行うには、以下の回避策を使用できます:
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)
このシグナルは、オブジェクト `obj ` が破棄される直前に、`QPointer ` のすべてのインスタンスへの通知が完了した後に発火し、ブロックすることはできません。
このシグナルが発信されると直後に、そのオブジェクトの子オブジェクトはすべて破棄されます。
deleteLater() およびQPointerも参照してください 。
[static, since 6.12] bool QObject::disconnect(QMetaObject::Connection &connection)
[static, since 6.12] bool QObject::disconnect(QMetaObject::Connection &&connection)
接続を切断します。
connection がinvalid であるか、すでに切断済みの場合は、何もしないでfalseを返す。
注: Qt 6.12 以前のバージョンでは 、この関数はconst-& のみを受け取っていました。
これらの関数は Qt 6.12 で導入されました。
connect()も参照してください 。
[static] bool QObject::disconnect(const QMetaObject::Connection &connection)
connection の接続を切断し、invalid にリセットします。
connection が無効であるか、すでに切断済みの場合は、何もしないで false を返します。
注:将来の Qt バージョンでは、ここでは const ではないオブジェクトのみが許容される可能性があります。
QT_NO_DISCONNECT_CONST_CONNECTION および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 sender クラスのメンバ、またはその親クラスのいずれのメンバでもない場合。
- method が、sender クラスまたはその親クラスのいずれかのメンバーでない場合。
- signal instance がシグナルを表していない場合。
注: connect() および対応する disconnect() の呼び出しでは、SIGNAL およびSLOT マクロを使用して、メンバー関数へのポインタまたは文字列ベースの構文を同様に使用してください 。
不一致を避けるため、connect() によって返された接続ハンドルを保存し、disconnect() の呼び出しでそれを使用してください。
注: queued connection が切断された場合でも 、すでにスケジュールされているイベントは配信される可能性があり、その結果、接続が切断された後にレシーバーが呼び出されることがあります。
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つの方法で使用されます。
- オブジェクトのシグナルに接続されているすべての接続を切断します:
QObject::disconnect(myObject, nullptr, nullptr, nullptr);非静的なオーバーロード関数と同等です
myObject->disconnect(); - 特定のシグナルに接続されているすべてのものを切断します:
QObject::disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);非静的なオーバーロード関数と同等
myObject->disconnect(SIGNAL(mySignal())); - 特定の受信機を切断する:
QObject::disconnect(myObject, nullptr, myReceiver, nullptr);非静的なオーバーロード関数と同等
myObject->disconnect(myReceiver);
注: connect() および対応する disconnect() の呼び出しでは、SIGNAL およびSLOT マクロを使用した、メンバー関数へのポインタまたは文字列ベースの同じ構文を使用してください 。
不整合を避けるため、connect() によって返された接続ハンドルを保存し、disconnect() の呼び出しでそれを使用してください。
注: queued connection が切断された場合でも 、すでにスケジュールされているイベントは配信される可能性があり、その結果、接続が切断された後に受信者が呼び出されることがあります。
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
このオブジェクト内のすべての信号を、receiver のmethod から切り離します。
注: connect() および対応する disconnect() の呼び出しでは、SIGNAL およびSLOT マクロを使用した、メンバー関数へのポインタまたは文字列ベースの同じ構文を使用してください 。
不一致を避けるため、connect() によって返された接続ハンドルを保存し、disconnect() の呼び出しでそれを使用してください。
注: queued connection が切断された場合でも 、すでにスケジュールされているイベントは配信される可能性があり、その結果、接続が切断された後に受信者が呼び出されることがあります。
シグナル・スロットの接続は、関係するいずれかのオブジェクトが破棄されると解除されます。
この関数は、QObject::disconnect() をオーバーロードしています。
bool QObject::disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const
receiver のmethod からsignal を切り離します。
注: connect() および対応する disconnect() の呼び出しでは、SIGNAL およびSLOT マクロを使用した、同じ構文(メンバー関数へのポインタまたは文字列ベース)を使用してください 。
不一致を避けるため、connect() によって返された接続ハンドルを保存し、disconnect() の呼び出しでそれを使用してください。
注: queued connection が切断された場合でも 、すでにスケジュールされているイベントは配信される可能性があり、その結果、接続が切断された後に受信者が呼び出されることがあります。
シグナル・スロット接続は、関連するオブジェクトのいずれかが破棄されると解除されます。
注: すべてのシグナル・スロット接続を切断すると 、QObject::destroyed() シグナルが接続されている場合は、そのシグナルも切断されます。これを行うと、リソースのクリーンアップにこのシグナルに依存しているクラスに悪影響を及ぼす可能性があります。アプリケーションコードによって接続された特定のシグナルのみを切断することをお勧めします。
この関数は、QObject::disconnect() をオーバーロードしています。
注: この関数はスレッドセーフです。
[static] template <typename PointerToMemberFunction> bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
オブジェクト `sender ` 内の `signal ` と、オブジェクト `receiver` 内の `method ` との接続を切断します。接続の切断に成功した場合は `true ` を返し、失敗した場合は `false` を返します。
シグナル・スロット接続は、関連するオブジェクトのいずれかが破棄されると解除されます。
disconnect() は通常、以下の例が示すように、3つの方法で使用されます。
- オブジェクトのシグナルに接続されているすべてのものを切断する:
QObject::disconnect(myObject, nullptr, nullptr, nullptr); - 特定のシグナルに接続されているすべてのものを切断する:
QObject::disconnect(myObject, &MyObject::mySignal, nullptr, nullptr); - 特定の受信者を切断する:
QObject::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()の対応する文字列ベースのオーバーロードを使用してください。
この関数は、QObject::disconnect() をオーバーロードします。
注: この関数はスレッドセーフです。
connect()も参照してください 。
[virtual protected] void QObject::disconnectNotify(const QMetaMethod &signal)
この仮想関数は、このオブジェクト内のsignal から何かが切断されたときに呼び出されます。
signal を特定のシグナルと比較する方法の例については、connectNotify()を参照してください。
このオブジェクトからすべてのシグナルが切断された場合(たとえば、disconnect() の引数 signal がnullptr であった場合など)、disconnectNotify() は 1 回だけ呼び出され、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を返してください。
例:
classMainWindow :publicQMainWindow
{
public:
MainWindow();
protected:
booleventFilter(QObject*obj,QEvent*ev) override;
private:
QTextEdit*textEdit;
};
MainWindow::MainWindow()
{
textEdit= newQTextEdit;
setCentralWidget(textEdit);
textEdit->installEventFilter(this);
}
boolMainWindow::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{
// イベントを親クラスに渡す
returnQMainWindow::eventFilter(obj,event);
}
}上記の例では、処理されなかったイベントが基底クラスの eventFilter() 関数に渡されていることに注目してください。これは、基底クラスが独自の内部処理のために eventFilter() を再実装している可能性があるためです。
QEvent::ShortcutOverride などの一部のイベントは、伝播を防ぐために(accept() を呼び出すことで)明示的に受け入れる必要があります。
警告: この関数内で受信者オブジェクトを削除する場合は 、必ず 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() を使用して、すべての子要素の完全なリストを取得することをお勧めします。
この例では、ボタンが親の直接の子要素でなかったとしても、parentWidget の子要素であるQPushButton である"button1" を返します:
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 以前のバージョンでは 、この関数はname をQString として扱い、QAnyStringView とは見なしていませんでした。
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 のうち、widgetname という名前の子QWidgetのリストを検索する方法を示しています:
この例は、parentWidget の子であるすべてのQPushButtonを返します:
QList<QPushButton *> allPButtons = parentWidget->findChildren<QPushButton *>();この例は、parentWidget の直子であるすべてのQPushButtonを返します:
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(Qt::FindDirectChildrenOnly);注: Qt 6.7以前のバージョンでは 、この関数は `name ` を `QString` として受け取り、`QAnyStringView` としては受け取りませんでした。
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
このオブジェクトの子要素のうち、型 T にキャスト可能であり、かつ正規表現re に一致する名前を持つものを返します。そのようなオブジェクトがない場合は、空のリストを返します。options で FindDirectChildrenOnly オプションが指定されていない限り、検索は再帰的に行われます。
この関数は、QObject::findChildren() をオーバーロードしています。
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` を返さなければなりません。
単一のオブジェクトに複数のイベントフィルターが登録されている場合、最後に登録されたフィルターが最初に有効になります。
このオブジェクトに対してfilterObj がすでにインストールされている場合、この関数はそれを移動させ、あたかも最後にインストールされたかのように動作させる。
以下は、監視対象オブジェクトのキー入力を吸収するKeyPressEater クラスです:
classKeyPressEater :publicQObject
{
Q_OBJECT
public:
KeyPressEater(QObject*parent =nullptr) : QObject(parent) {}
//...
protected:
booleventFilter(QObject*obj,QEvent*event) override;
};
boolKeyPressEater::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{
// 標準的なイベント処理
returnQObject::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 を返すと、Qt XML はその削除されたオブジェクトにイベントを送信してしまい、プログラムがクラッシュします。
なお、フィルタリング対象のオブジェクトは、このオブジェクトと同じスレッドにある必要があります。filterObj が別のスレッドにある場合、この関数は何も行いません。この関数の呼び出し後に、filterObj またはこのオブジェクトのいずれかが別のスレッドに移動された場合、両方のオブジェクトが再び同じスレッドに属するようになるまで(アフィニティが解除されない限り)、イベントフィルタは呼び出されません。
removeEventFilter()、eventFilter()、およびevent()も参照してください 。
[noexcept, since 6.11] bool QObject::isQmlExposed() const
そのオブジェクトがQMLエンジンによって作成されたものか、それともQJSEngine::setObjectOwnership() を通じて明示的に所有権が設定されたものかを返します。
この関数は Qt 6.11 で導入されました。
[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 (QObject::isSignalConnected(valueChangedSignal)) {
QByteArray data;
data = get_the_value(); // expensive operation
emit valueChanged(data);
}上記のコードスニペットが示すように、この関数を使用することで、負荷の高い操作を回避したり、誰もリッスンしていないシグナルを発行したりすることを防ぐことができます。
警告: マルチスレッドアプリケーションでは 、この関数を連続して呼び出しても、同じ結果が得られるとは限りません。
警告: この関数は 、オブジェクト指向のモジュール性の原則に違反しています。特に、connectNotify() やdisconnectNotify() のオーバーライドからは、この関数を呼び出してはなりません。これらの関数は、どのスレッドからでも呼び出される可能性があるためです。
receivers()も参照してください 。
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 イベントが送信されます。このイベントを処理して、特別な処理を実行することができます。なお、このオブジェクトに投稿された新しいイベントは、targetThread で処理されます(ただし、nullptr でない場合に限ります)。nullptr の場合、このオブジェクトやその子オブジェクトはもはやどのスレッドにも関連付けられていないため、イベント処理は一切行われません。
警告: この関数はスレッドセーフではありません。現在のスレッドは、現在のスレッドアフィニティと一致している必要があります。つまり、この関数はオブジェクトを現在のスレッドから別のスレッドへ「プッシュ」することしかできず、任意のスレッドから現在のスレッドへオブジェクトを「プル」することはできません。 ただし、このルールには1つの例外があります。スレッドアフィニティを持たないオブジェクトは、現在のスレッドに「引き込む」ことができます。
Qt 6.7 以前のバージョンでは、この関数には戻り値がありませんでした (void)。
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);
}上記のコードスニペットが示すように、この関数を使用することで、負荷の高い処理を回避したり、誰もリッスンしていないシグナルの発信を避けたりすることができます。
警告: マルチスレッドアプリケーションでは 、この関数を連続して呼び出した場合、同じ結果が得られるとは限りません。
警告:この関数は 、オブジェクト指向のモジュール性の原則に違反しています。特に、connectNotify() やdisconnectNotify() のオーバーライドからこの関数を呼び出してはなりません。これらは任意のスレッドから呼び出される可能性があるためです。
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)
この関数は、QObject::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);Qt 6.10 以降、負のインターバルを設定すると、実行時の警告が表示され、その値は 1ms にリセットされます。 Qt 6.10 以前では、Qt Timer では負の間隔を設定することは可能でしたが、予期せぬ動作(例えば、タイマーが実行中であれば停止したり、まったく開始しなかったりすることなど)が発生していました。
timerEvent()、killTimer()、QChronoTimer 、およびQBasicTimerも参照してください 。
int QObject::startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer)
タイマーを開始し、タイマー識別子を返します。タイマーを開始できなかった場合は、0を返します。
killTimer()が呼び出されるまで、interval ごとにタイマーイベントが発生します。interval がstd::chrono::duration::zero() に等しい場合、タイマーイベントは、制御がイベントループに戻るたびに1回発生します。つまり、処理すべきネイティブウィンドウシステムイベントがもうない状態です。
Qt 6.10 以降、負のインターバルを設定すると、実行時の警告が表示され、値は 1ms にリセットされます。 Qt 6.10 以前では、Qt Timer で負のインターバルを設定することは可能でしたが、予期せぬ動作(例えば、タイマーが実行中であれば停止したり、まったく開始されなかったりすること)が発生していました。
タイマーイベントが発生すると、仮想関数 `timerEvent()` が、イベントパラメータクラス `QTimerEvent ` とともに呼び出されます。タイマーイベントを取得するには、この関数を再実装してください。
複数のタイマーが実行中の場合、QTimerEvent::id() メソッドを使用することで、どのタイマーが起動したかを確認できます。
例:
classMyObject :publicQObject
{
Q_OBJECT
public:
MyObject(QObject*parent =nullptr);
Q_SIGNALS:
voidvalueChanged();
protected:
voidtimerEvent(QTimerEvent*event) override;
};
MyObject::MyObject(QObject*parent)
: QObject(parent)
{
using namespacestd::chrono_literals;
startTimer(50ms);
startTimer(5s);
startTimer(10min);
startTimer(1h);
}
voidMyObject::timerEvent(QTimerEvent*event)
{
qDebug() << "Timer ID:" << event->id();
}なお、タイマーの精度は、基盤となるオペレーティングシステムやハードウェアによって異なります。
timerType 引数を使用すると、タイマーの精度をカスタマイズできます。さまざまなタイマータイプに関する情報については、Qt::TimerType を参照してください。ほとんどのプラットフォームでは 20 ミリ秒の精度がサポートされていますが、それ以上の精度を提供するプラットフォームもあります。Qt が要求された数のタイマーイベントを配信できない場合、一部のイベントは黙って破棄されます。
QTimer およびQChronoTimer クラスは、イベントの代わりにシングルショットタイマーとタイマーシグナルを用いた高レベルなプログラミングインターフェースを提供します。また、QBasicTimer クラスもあり、これはQChronoTimer よりも軽量ですが、タイマーIDを直接使用するよりも扱いやすくなっています。
注: Qt 6.8以降、 interval の型はstd::chrono::nanoseconds となり、それ以前はstd::chrono::milliseconds でした。この変更は、以前の Qt リリースとの下位互換性を保っています。
注: Qt 6.8では 、QObject がQt::TimerId を使用してタイマー ID を表すように変更されました。このメソッドは下位互換性を確保するために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)
sourceText の翻訳版を返します。複数形を含む文字列については、オプションでdisambiguation の文字列とn の値を基に翻訳を行います。適切な翻訳文字列が存在しない場合は、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() および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()も参照してください 。
関連する非メンバ
QObjectList
[since 6.8] enum class TimerId
これは、タイマーID(例:QTimer やQChronoTimer )を表すために使用されます。基底型はint です。qToUnderlying() を使用すると、Qt::TimerIdをint に変換できます。
| 定数 | 値 | 説明 |
|---|---|---|
QObject::TimerId::Invalid | 0 | 何もしないタイマーの ID を表します。その使用法は文脈によって異なります。例えば、QObject::startTimer() は、タイマーの起動に失敗したことを示すためにこの値を返します。一方、QChronoTimer::id() は、タイマーが非アクティブである場合にこの値を返します。つまり、timer.isActive() がfalse を返します。 |
この列挙型は Qt 6.8 で導入されました。
QTimer::id()、QChronoTimer::id()、およびQObject::startTimer()も参照してください 。
template <typename T> T qobject_cast(QObject *object)
template <typename T> T qobject_cast(const QObject *object)
指定されたobject を、そのオブジェクトが型T(またはそのサブクラス)である場合は型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 == nullptrqobject_cast() 関数は、標準 C++ のdynamic_cast() と同様の挙動を示しますが、RTTI のサポートを必要とせず、ダイナミックライブラリの境界を越えて動作するという利点があります。
qobject_cast()はインターフェースと組み合わせて使用することもできます。
警告: TがQ_OBJECT マクロで宣言されていない場合 、この関数の戻り値は未定義となります。
QObject::inherits()も参照してください 。
マクロのドキュメント
[since 6.7] QT_NO_CONTEXTLESS_CONNECT
このマクロを定義すると、シグナルをファンクタに接続するQObject::connect()のオーバーロードが、QObject をレシーバー/コンテキストオブジェクトとして指定しない場合(つまり、QObject::connect()の3引数オーバーロード)は無効になります。
コンテキストなしのオーバーロードを使用すると、エラーが発生しやすくなります。これは、受信側のローカル状態に依存するファンクタに接続してしまうことが容易だからです。そのようなローカル状態が破棄されても、接続は自動的に切断されません。
さらに、このような接続は常に直接接続となるため、マルチスレッド環境では問題を引き起こす可能性があります(例えば、シグナルが別のスレッドから発信された場合など)。
このマクロは Qt 6.7 で導入されました。
QObject::connect およびQt::ConnectionTypeも参照してください 。
[since 6.12] QT_NO_DISCONNECT_CONST_CONNECTION
QObject::disconnect() のconst & オーバーロードを無効にし、呼び出し元に非constオブジェクトを渡すよう強制します。
非constオブジェクトを渡す方が推奨されます。非constオブジェクトは直ちにリセットできるため、リソースをより早く解放できるからです。 Qtのバージョンによって、constオーバーロードの扱いは異なります。古いバージョンのQtでは、もともとconst として宣言されたConnectionをconstオーバーロードで呼び出すと、未定義の挙動を引き起こす可能性があります。現在のQtバージョンではこの点に関して安全ですが、将来のバージョンではconstオーバーロードが削除されたり、Connectionオブジェクトが再代入または破棄されるまでリソースの解放が遅延されるようになる可能性があります。
const ではないオブジェクトを渡すことで、上記の問題をすべて回避できます。
このマクロが設定された状態でコンパイルされたコードは、マクロが無効な状態でもコンパイルされ(未定義の挙動も発生せず)、Qt 5.0以降のすべてのバージョンで動作します。
このマクロは Qt 6.12 で導入されました。
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 Object Types を定義する際、プロパティをデフォルトとして指定することができます:
Q_CLASSINFO("DefaultProperty", "content")「 QMetaObject::classInfo()」、「Qt D-Bus アダプタの使用」、および「C++からのQML型の定義」も参照してください 。
Q_EMIT
サードパーティ製のシグナル/スロット機構で Qt シグナルとスロットを使用する場合、シグナルの発信時に `emit ` キーワードを置き換えるには、このマクロを使用します。
このマクロは通常、.pro ファイル内でCONFIG 変数によってno_keywords が指定されている場合に使用されますが、no_keywords が指定されていない場合でも使用可能です。
Q_ENUM(...)
このマクロは、列挙型をメタオブジェクトシステムに登録します。このマクロは、Q_OBJECT 、Q_GADGET 、またはQ_GADGET_EXPORT マクロが定義されているクラス内の、列挙型の宣言の後に配置する必要があります。名前空間を使用する場合は、代わりに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::fromType() を使用してQMetaEnum を取得することもできます。
登録された列挙型は、Qtのメタ型システムにも自動的に登録されるため、Q_DECLARE_METATYPE()を使用しなくてもQMetaType から認識されます。これにより、便利な機能が利用可能になります。例えば、QVariant で使用した場合、それらを文字列に変換することができます。同様に、QDebug に渡しれば、その名前が出力されます。
Qtのプロパティシステムも参照してください 。
Q_ENUM_NS(...)
このマクロは、列挙型をメタオブジェクトシステムに登録します。これは、Q_NAMESPACE マクロが定義されている名前空間内で、列挙型の宣言の後に配置する必要があります。これはQ_ENUM と同じ機能ですが、名前空間内での使用となります。
Q_ENUM_NS を使用して宣言された列挙型については、そのQMetaEnum が、それを囲むQMetaObject に登録されます。また、QMetaEnum::fromType() を使用して、QMetaEnum を取得することもできます。
登録された列挙型は、Qtのメタ型システムにも自動的に登録されるため、Q_DECLARE_METATYPE() を使用することなく、QMetaType から認識されます。これにより、便利な機能が利用可能になります。例えば、QVariant で使用した場合、それらを文字列に変換することができます。同様に、QDebug に渡すと、その名前が出力されます。
Qtのプロパティシステムも参照してください 。
Q_FLAG(...)
このマクロは、単一のflags type をメタオブジェクトシステムに登録します。通常、クラス定義内で使用され、特定の列挙型の値をフラグとして使用でき、ビット単位のOR演算子を用いて組み合わせることができることを宣言するために用いられます。名前空間を使用する場合は、代わりにQ_FLAG_NS()を使用してください。
このマクロは、enumの宣言の後に配置する必要があります。flags型の宣言は、Q_DECLARE_FLAGS()マクロを使用して行います。
たとえば、QItemSelectionModel では、SelectionFlags フラグは次のように宣言されます。
class Q_CORE_EXPORT 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 と同じ機能ですが、名前空間内で使用される点が異なります。
このマクロは、列挙型の宣言の後に配置する必要があります。
注:Q_FLAG_NSマクロは 、個々のフラグ値をメタオブジェクトシステムに登録する処理を行うため、このマクロに加えてQ_ENUM_NS()を使用する必要はありません。
Qtのプロパティシステムも参照してください 。
Q_GADGET
Q_GADGET マクロは、QObject を継承していないが、QMetaObject が提供するリフレクション機能の一部を利用したいクラス向けの、Q_OBJECT マクロの軽量版です。
注:このマクロの展開結果は 、private: アクセス指定子で終わります。このマクロの直後にメンバを宣言すると、それらのメンバも private になります。マクロの直後に public(または protected)のメンバを追加するには、public: (またはprotected: )のアクセス指定子を使用してください。
Q_GADGETはQ_ENUM 、Q_PROPERTY 、およびQ_INVOKABLE を持つことができますが、シグナルやスロットを持つことはできません。
Q_GADGET は、クラスメンバである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: アクセス指定子で終わります。このマクロの直後にメンバーを宣言すると、それらのメンバーもプライベートになります。マクロの直後にパブリック(またはプロテクト)メンバーを追加するには、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 マクロは、クラスの内部でも外部でも使用でき、Meta-Object Compilerに対してインクルードを追加するよう指示します。
// 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: アクセス指定子で終了します。このマクロの直後にメンバを宣言すると、それらのメンバも private になります。マクロの直後に public (または protected) メンバを追加するには、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]
[VIRTUAL]
[OVERRIDE]
[REQUIRED])プロパティ名、型、およびREAD 関数は必須です。型は、QVariant でサポートされている任意の型、またはユーザー定義型にすることができます。その他の項目は省略可能ですが、WRITE 関数を指定するのが一般的です。属性のデフォルト値はtrueですが、USER は例外で、デフォルト値はfalseです。
例:
Q_PROPERTY(QString title READ title WRITE setTitle USER true)このマクロの使用方法の詳細や、より具体的な使用例については、Qtのプロパティシステムに関する解説を参照してください。
Qtのプロパティシステムも参照してください 。
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に動的に公開する際に役立ちます。これにより、その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 クラスを使用する場合、このコードでは、期待されるバージョンが2.1 以上である場合にのみ、newProperty および newMethod が公開されます。
タグが付けられていないメソッドはすべてリビジョン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
これは、単一の関数をシグナルとしてマークできるようにする追加のマクロです。特に、signals やQ_SIGNALS といったグループを認識しないサードパーティ製のソースコードパーサーを使用する場合に、非常に役立ちます。
サードパーティ製のシグナル/スロット機構でQtのシグナルとスロットを使用したい場合、クラス宣言内のsignals キーワードを置き換えるためにこのマクロを使用してください。
このマクロは通常、.pro ファイルでCONFIG 変数とともにno_keywords が指定されている場合に使用されますが、no_keywords が指定されていない場合でも使用可能です。
Q_SIGNALS
サードパーティ製のシグナル/スロット機構でQtのシグナルとスロットを使用したい場合、このマクロを使用して、クラス宣言内のsignals キーワードを置換してください。
このマクロは通常、.pro ファイル内でCONFIG 変数によってno_keywords が指定されている場合に使用されますが、no_keywords が指定されていない場合でも使用可能です。
Q_SLOT
これは、単一の関数をスロットとしてマークできるようにする追加のマクロです。特に、slots やQ_SLOTS といったグループを認識しないサードパーティ製のソースコードパーサーを使用する場合に、非常に役立ちます。
サードパーティ製のシグナル/スロット機構で Qt シグナルとスロットを使用したい場合、クラス宣言内の `slots ` キーワードをこのマクロで置き換えてください。
このマクロは通常、.pro ファイルでCONFIG 変数と共にno_keywords が指定されている場合に使用されますが、no_keywords が指定されていない場合でも使用可能です。
Q_SLOTS
サードパーティ製のシグナル/スロット機構で Qt シグナルとスロットを使用したい場合、このマクロを使用して、クラス宣言内の `slots ` キーワードを置換してください。
このマクロは通常、.pro ファイルでCONFIG 変数と共にno_keywords が指定されている場合に使用されますが、no_keywords が指定されていない場合でも使用可能です。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.