QObject Class

Die Klasse QObject ist die Basisklasse für alle Qt-Objekte. Mehr...

Kopfzeile: #include <QObject>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Vererbt von:
284 types

Q3DGraphsWidgetItem, Q3DObject, Q3DScene, Q3DTheme, QAbstract3DAxis, QAbstract3DInputHandler, QAbstract3DSeries, QAbstractAnimation, QAbstractAxis, QAbstractDataProxy, QAbstractEventDispatcher, QAbstractHttpServer, QAbstractItemDelegate, QAbstractItemModel, QAbstractItemModelTester, QAbstractNetworkCache, QAbstractOAuth, QAbstractOAuthReplyHandler, QAbstractSeries, QAbstractState, QAbstractTextDocumentLayout, QAbstractTransition, QAccessiblePlugin, QAction, QActionGroup, QAmbientSound, QAudioBufferInput, QAudioBufferOutput, QAudioDecoder, QAudioEngine, QAudioInput, QAudioListener, QAudioOutput, QAudioRoom, QAudioSink, QAudioSource, QAxBaseObject, QAxFactory, QAxScript, QAxScriptManager, QBarModelMapper, QBarSet, QBluetoothDeviceDiscoveryAgent, QBluetoothLocalDevice, QBluetoothServer, QBluetoothServiceDiscoveryAgent, QBoxSet, QButtonGroup, QCamera, QCanBus, QCanBusDevice, QCandlestickModelMapper, QCandlestickSet, QChronoTimer, QClipboard, QCoapClient, QCompleter, QCoreApplication, QCustom3DItem, QDataWidgetMapper, QDBusAbstractAdaptor, QDBusAbstractInterface, QDBusPendingCallWatcher, QDBusServer, QDBusServiceWatcher, QDBusVirtualObject, QDesignerFormEditorInterface, QDesignerFormWindowManagerInterface, QDnsLookup, QDrag, QDtls, QDtlsClientVerifier, QEventLoop, QExtensionFactory, QExtensionManager, QFileSelector, QFileSystemWatcher, QFutureWatcher, QGenericPlugin, QGeoAreaMonitorSource, QGeoCodeReply, QGeoCodingManager, QGeoCodingManagerEngine, QGeoPositionInfoSource, QGeoRouteReply, QGeoRoutingManager, QGeoRoutingManagerEngine, QGeoSatelliteInfoSource, QGeoServiceProvider, QGesture, QGraphicsAnchor, QGraphicsEffect, QGraphicsItemAnimation, QGraphicsObject, QGraphicsScene, QGraphicsTransform, QGraphsTheme, QGrpcClientBase, QGrpcOperation, QGrpcOperationContext, QHelpEngineCore, QHelpFilterEngine, QHelpSearchEngine, QHelpSearchEngineCore, QHttpMultiPart, QIconEnginePlugin, QImageCapture, QImageIOPlugin, QInputDevice, QInputMethod, QIODevice, QItemSelectionModel, QJSEngine, QLayout, QLegendMarker, QLibrary, QLocalServer, QLowEnergyController, QLowEnergyService, QMaskGenerator, QMediaCaptureSession, QMediaDevices, QMediaPlayer, QMediaRecorder, QMimeData, QModbusDevice, QModbusReply, QMovie, QMqttClient, QMqttSubscription, QNearFieldManager, QNearFieldTarget, QNetworkAccessManager, QNetworkCookieJar, QNetworkInformation, QObjectCleanupHandler, QOffscreenSurface, QOpcUaClient, QOpcUaGdsClient, QOpcUaGenericStructHandler, QOpcUaHistoryReadResponse, QOpcUaKeyPair, QOpcUaNode, QOpcUaProvider, QOpenGLContext, QOpenGLContextGroup, QOpenGLDebugLogger, QOpenGLShader, QOpenGLShaderProgram, QOpenGLTimeMonitor, QOpenGLTimerQuery, QOpenGLVertexArrayObject, QPdfDocument, QPdfPageNavigator, QPdfPageRenderer, QPdfWriter, QPieModelMapper, QPieSlice, QPlaceManager, QPlaceManagerEngine, QPlaceReply, QPluginLoader, QQmlComponent, QQmlContext, QQmlEngineExtensionPlugin, QQmlExpression, QQmlExtensionPlugin, QQmlFileSelector, QQmlImageProviderBase, QQmlPropertyMap, QQuick3DObject, QQuickAttachedPropertyPropagator, QQuickImageResponse, QQuickItem, QQuickItemGrabResult, QQuickRenderControl, QQuickTextDocument, QQuickTextureFactory, QQuickWebEngineProfile, QRemoteObjectAbstractPersistedStore, QRemoteObjectNode, QRemoteObjectPendingCallWatcher, QRemoteObjectReplica, QRestAccessManager, QScreen, QScreenCapture, QScroller, QScxmlDataModel, QScxmlInvokableService, QScxmlInvokableServiceFactory, QScxmlStateMachine, QSensor, QSensorBackend, QSensorReading, QSessionManager, QSettings, QSGTexture, QSGTextureProvider, QSharedMemory, QShortcut, QSignalMapper, QSocketNotifier, QSoundEffect, QSpatialSound, QSqlDriver, QSqlDriverPlugin, QStyle, QStyleHints, QStylePlugin, QSvgRenderer, QSyntaxHighlighter, QSystemTrayIcon, Qt3DAnimation::QAbstractAnimation, Qt3DAnimation::QAnimationController, Qt3DAnimation::QAnimationGroup, Qt3DAnimation::QMorphTarget, Qt3DCore::QAbstractAspect, Qt3DCore::QAspectEngine, Qt3DCore::QNode, Qt3DCore::Quick::QQmlAspectEngine, Qt3DInput::QInputDeviceIntegration, Qt3DInput::QKeyEvent, Qt3DInput::QMouseEvent, Qt3DInput::QWheelEvent, Qt3DRender::QGraphicsApiFilter, Qt3DRender::QPickEvent, Qt3DRender::QRenderCapabilities, Qt3DRender::QRenderCaptureReply, Qt3DRender::QStencilOperationArguments, Qt3DRender::QStencilTestArguments, Qt3DRender::QTextureWrapMode, QTcpServer, QTextDocument, QTextObject, QTextToSpeech, QThread, QThreadPool, QTimeLine, QTimer, QTranslator, QUiLoader, QUndoGroup, QUndoStack, QValidator, QValue3DAxisFormatter, QVideoFrameInput, QVideoSink, QVirtualKeyboardAbstractInputMethod, QVirtualKeyboardDictionary, QVirtualKeyboardDictionaryManager, QVirtualKeyboardInputContext, QVirtualKeyboardInputEngine, QVirtualKeyboardObserver, QVirtualKeyboardTrace, QWaylandClient, QWaylandObject, QWaylandQuickShellIntegration, QWaylandSurfaceGrabber, QWaylandView, QWaylandXdgPopup, QWaylandXdgToplevel, QWebChannel, QWebChannelAbstractTransport, QWebEngineClientHints, QWebEngineContextMenuRequest, QWebEngineCookieStore, QWebEngineDownloadRequest, QWebEngineHistory, QWebEngineNavigationRequest, QWebEngineNewWindowRequest, QWebEngineNotification, QWebEnginePage, QWebEngineProfile, QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler, QWebEngineWebAuthUxRequest, QWebSocket, QWebSocketServer, QWidget, QWindow, QWindowCapture, QWinEventNotifier, und QXYModelMapper

Hinweis: Alle Funktionen in dieser Klasse sind reentrant.

Hinweis: Diese Funktionen sind auch thread-sicher:

  • 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 *Methode, 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 *Empfänger, const char *Methode)
  • disconnect(const char *Signal, const QObject *Empfänger, const char *Methode) const
  • disconnect(const QObject *Sender, PointerToMemberFunction signal, const QObject *Empfänger, PointerToMemberFunction method)
  • deleteLater()

Eigenschaften

Öffentliche Funktionen

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

Öffentliche Slots

void deleteLater()

Signale

void destroyed(QObject *obj = nullptr)
void objectNameChanged(const QString &objectName)

Statische öffentliche Mitglieder

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)

Geschützte Funktionen

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)

Makros

Detaillierte Beschreibung

QObject ist das Herzstück des Qt-Objektmodells. Das zentrale Merkmal dieses Modells ist ein sehr mächtiger Mechanismus für nahtlose Objektkommunikation, genannt Signale und Slots. Sie können ein Signal mit connect() mit einem Slot verbinden und die Verbindung mit disconnect() zerstören. Um endlose Benachrichtigungsschleifen zu vermeiden, können Sie Signale mit blockSignals() vorübergehend blockieren. Die geschützten Funktionen connectNotify() und disconnectNotify() ermöglichen es, Verbindungen zu verfolgen.

QObjects organisieren sich in Objektbäumen. Wenn Sie ein QObject mit einem anderen Objekt als Elternteil erstellen, fügt sich das Objekt automatisch in die children()-Liste des Elternteils ein. Der Elternteil übernimmt das Eigentum an dem Objekt, d.h. er löscht seine Kinder automatisch in seinem Destruktor. Sie können ein Objekt über den Namen und optional über den Typ mit findChild() oder findChildren() suchen.

Jedes Objekt hat eine objectName() und sein Klassenname kann über die entsprechende metaObject() gefunden werden (siehe QMetaObject::className()). Mit der Funktion inherits() können Sie feststellen, ob die Klasse des Objekts eine andere Klasse in der QObject-Vererbungshierarchie erbt.

Wenn ein Objekt gelöscht wird, sendet es ein destroyed()-Signal aus. Sie können dieses Signal abfangen, um baumelnde Referenzen auf QObjects zu vermeiden.

QObjects können Ereignisse über event() empfangen und die Ereignisse anderer Objekte filtern. Siehe installEventFilter() und eventFilter() für Details. Ein bequemer Handler, childEvent(), kann neu implementiert werden, um Child-Ereignisse abzufangen.

Zu guter Letzt bietet QObject die grundlegende Timer-Unterstützung in Qt; siehe QChronoTimer für High-Level-Unterstützung für Timer.

Beachten Sie, dass das Q_OBJECT Makro für jedes Objekt, das Signale, Slots oder Eigenschaften implementiert, obligatorisch ist. Sie müssen auch den Meta-Object Compiler auf die Quelldatei anwenden. Wir empfehlen dringend die Verwendung dieses Makros in allen Unterklassen von QObject, unabhängig davon, ob sie tatsächlich Signale, Slots und Eigenschaften verwenden oder nicht, da ein Verzicht auf dieses Makro dazu führen kann, dass bestimmte Funktionen ein seltsames Verhalten zeigen.

Alle Qt Widgets erben von QObject. Die Komfortfunktion isWidgetType() gibt zurück, ob ein Objekt tatsächlich ein Widget ist. Sie ist viel schneller als qobject_cast<QWidget *>(obj) oder obj->inherits("QWidget").

Einige QObject-Funktionen, z.B. children(), geben ein QObjectList zurück. QObjectList ist ein Typedef für QList<QObject *>.

Thread-Affinität

Von einer QObject-Instanz wird gesagt, dass sie eine Thread-Affinität hat, oder dass sie in einem bestimmten Thread lebt. Wenn ein QObject ein queued signal oder ein gepostetes Ereignis empfängt, wird der Slot oder der Event-Handler in dem Thread ausgeführt, in dem das Objekt lebt.

Hinweis: Wenn ein QObject keine Thread-Affinität hat (d.h. wenn thread() Null zurückgibt), oder wenn es in einem Thread lebt, der keine laufende Ereignisschleife hat, dann kann es keine Warteschlangensignale oder gepostete Ereignisse empfangen.

Standardmäßig lebt ein QObject in dem Thread, in dem es erstellt wurde. Die Thread-Affinität eines Objekts kann mit thread() abgefragt und mit moveToThread() geändert werden.

Alle QObjects müssen im selben Thread wie ihre Eltern leben. Daraus folgt:

  • setParent() schlägt fehl, wenn die beiden beteiligten QObjects in verschiedenen Threads leben.
  • Wenn ein QObject in einen anderen Thread verschoben wird, werden alle seine Kinder automatisch mitverschoben.
  • moveToThread() schlägt fehl, wenn das QObject einen Parent hat.
  • Wenn QObjects innerhalb von QThread::run() erstellt werden, können sie nicht Kinder des QThread Objekts werden, da QThread nicht in dem Thread lebt, der QThread::run() aufruft.

Hinweis: Die Mitgliedsvariablen eines QObjects werden nicht automatisch zu seinen Kindern. Die Eltern-Kind-Beziehung muss entweder durch die Übergabe eines Zeigers auf das Kind constructor oder durch den Aufruf von setParent() festgelegt werden. Ohne diesen Schritt bleiben die Mitgliedsvariablen des Objekts im alten Thread, wenn moveToThread() aufgerufen wird.

Kein Kopierkonstruktor oder Zuweisungsoperator

QObject hat weder einen Kopierkonstruktor noch einen Zuweisungsoperator. Dies ist beabsichtigt. Tatsächlich werden sie deklariert, aber in einem private Abschnitt mit dem Makro Q_DISABLE_COPY(). Tatsächlich verwenden alle von QObject abgeleiteten Qt-Klassen (direkt oder indirekt) dieses Makro, um ihren Kopierkonstruktor und Zuweisungsoperator als privat zu deklarieren. Die Gründe dafür finden Sie in der Diskussion über Identität vs. Wert auf der Seite Qt Object Model.

Die wichtigste Konsequenz ist, dass Sie Zeiger auf QObject (oder auf Ihre QObject-Unterklasse) verwenden sollten, wo Sie sonst versucht sein könnten, Ihre QObject-Unterklasse als Wert zu verwenden. Ohne einen Kopierkonstruktor können Sie beispielsweise eine Unterklasse von QObject nicht als Wert verwenden, der in einer der Containerklassen gespeichert werden soll. Sie müssen Zeiger speichern.

Auto-Verbindung

Das Meta-Objektsystem von Qt bietet einen Mechanismus, um Signale und Slots zwischen QObject-Unterklassen und ihren Kindern automatisch zu verbinden. Solange Objekte mit geeigneten Objektnamen definiert sind und Slots einer einfachen Namenskonvention folgen, kann diese Verbindung zur Laufzeit durch die Funktion QMetaObject::connectSlotsByName() durchgeführt werden.

uic generiert Code, der diese Funktion aufruft, um die automatische Verbindung zwischen Widgets in Formularen, die mit Qt Widgets Designer erstellt wurden, zu ermöglichen. Weitere Informationen zur Verwendung der automatischen Verbindung mit Qt Widgets Designer finden Sie im Abschnitt Verwenden einer Designer UI-Datei in Ihrer Anwendung des Qt Widgets Designer-Handbuchs.

Dynamische Eigenschaften

Dynamische Eigenschaften können zur Laufzeit zu QObject-Instanzen hinzugefügt und von diesen entfernt werden. Dynamische Eigenschaften müssen nicht zur Kompilierzeit deklariert werden, bieten aber die gleichen Vorteile wie statische Eigenschaften und werden mit der gleichen API bearbeitet - mit property() zum Lesen und setProperty() zum Schreiben der Eigenschaften.

Dynamische Eigenschaften werden von Qt Widgets Designer unterstützt, und sowohl standardmäßige Qt Widgets als auch vom Benutzer erstellte Formulare können mit dynamischen Eigenschaften versehen werden.

Internationalisierung (I18n)

Alle QObject-Unterklassen unterstützen die Übersetzungsfunktionen von Qt, wodurch es möglich ist, die Benutzeroberfläche einer Anwendung in verschiedene Sprachen zu übersetzen.

Um für den Benutzer sichtbaren Text übersetzbar zu machen, muss er in Aufrufe der Funktion tr() verpackt werden. Dies wird im Detail im Dokument Writing Source Code for Translation erklärt.

Siehe auch QMetaObject, QPointer, QObjectCleanupHandler, Q_DISABLE_COPY() und Object Trees & Ownership.

Dokumentation der Eigenschaften

[bindable] objectName : QString

Hinweis: Diese Eigenschaft unterstützt QProperty Bindungen.

Diese Eigenschaft enthält den Namen dieses Objekts

Sie können ein Objekt über den Namen (und den Typ) mit findChild() finden. Sie können eine Gruppe von Objekten mit findChildren() finden.

qDebug("MyClass::setPrecision(): (%s) ungültige Genauigkeit %f",       qPrintable(objectName()), newPrecision);

Standardmäßig enthält diese Eigenschaft eine leere Zeichenkette.

Siehe auch metaObject() und QMetaObject::className().

Dokumentation der Mitgliedsfunktionen

[explicit invokable] QObject::QObject(QObject *parent = nullptr)

Konstruiert ein Objekt mit dem übergeordneten Objekt parent.

Das übergeordnete Objekt kann als Eigentümer des Objekts betrachtet werden. Zum Beispiel ist dialog box das übergeordnete Objekt der Schaltflächen OK und Cancel, die es enthält.

Der Destruktor eines übergeordneten Objekts vernichtet alle untergeordneten Objekte.

Wenn Sie parent auf nullptr setzen, wird ein Objekt ohne Elternteil erzeugt. Wenn das Objekt ein Widget ist, wird es zu einem Fenster der obersten Ebene.

Hinweis: Diese Funktion kann über das Meta-Objektsystem und von QML aus aufgerufen werden. Siehe Q_INVOKABLE.

Siehe auch parent(), findChild(), und findChildren().

[virtual noexcept] QObject::~QObject()

Zerstört das Objekt und löscht alle seine untergeordneten Objekte.

Alle Signale an und von dem Objekt werden automatisch unterbrochen, und alle ausstehenden Ereignisse für das Objekt werden aus der Ereigniswarteschlange entfernt. Es ist jedoch oft sicherer, deleteLater() zu verwenden, als eine QObject Unterklasse direkt zu löschen.

Warnung: Alle untergeordneten Objekte werden gelöscht. Wenn sich eines dieser Objekte auf dem Stack oder global befindet, wird Ihr Programm früher oder später abstürzen. Wir raten davon ab, Zeiger auf Kindobjekte von außerhalb der Elternklasse zu halten. Wenn Sie es dennoch tun, gibt Ihnen das Signal destroyed() die Möglichkeit zu erkennen, wann ein Objekt zerstört wird.

Warnung: Das Löschen eines QObject, während es ein an es geliefertes Ereignis verarbeitet, kann zu einem Absturz führen. Sie dürfen QObject nicht direkt löschen, wenn es sich in einem anderen Thread befindet als dem, der gerade ausgeführt wird. Verwenden Sie stattdessen deleteLater(), was die Ereignisschleife veranlasst, das Objekt zu löschen, nachdem alle anstehenden Ereignisse an es geliefert wurden.

Siehe auch deleteLater().

[noexcept] bool QObject::blockSignals(bool block)

Wenn block wahr ist, werden die von diesem Objekt ausgesandten Signale blockiert (d. h. das Aussenden eines Signals ruft nichts auf, was mit ihm verbunden ist). Wenn block false ist, findet keine solche Blockierung statt.

Der Rückgabewert ist der vorherige Wert von signalsBlocked().

Beachten Sie, dass das Signal destroyed() auch dann ausgesendet wird, wenn die Signale für dieses Objekt blockiert wurden.

Signale, die während einer Blockierung ausgegeben werden, werden nicht gepuffert.

Siehe auch signalsBlocked() und QSignalBlocker.

[virtual protected] void QObject::childEvent(QChildEvent *event)

Dieser Event-Handler kann in einer Unterklasse neu implementiert werden, um untergeordnete Ereignisse zu empfangen. Das Ereignis wird mit dem Parameter event übergeben.

QEvent::ChildAdded und QEvent::ChildRemoved Ereignisse werden an Objekte gesendet, wenn Kinder hinzugefügt oder entfernt werden. In beiden Fällen können Sie sich nur darauf verlassen, dass das Kind ein QObject ist, oder, wenn isWidgetType() true zurückgibt, ein QWidget. (Das liegt daran, dass im Fall von ChildAdded das Kind noch nicht vollständig konstruiert ist, und im Fall von ChildRemoved könnte es bereits zerstört worden sein).

QEvent::ChildPolished Ereignisse werden an Widgets gesendet, wenn Kinder poliert werden oder wenn polierte Kinder hinzugefügt werden. Wenn Sie ein poliertes Kind-Ereignis erhalten, ist die Konstruktion des Kindes normalerweise abgeschlossen. Dies ist jedoch nicht garantiert, und es können mehrere Polishing-Ereignisse während der Ausführung des Konstruktors eines Widgets eintreffen.

Für jedes untergeordnete Widget erhalten Sie ein ChildAdded Ereignis, null oder mehr ChildPolished Ereignisse und ein ChildRemoved Ereignis.

Das ChildPolished Ereignis wird ausgelassen, wenn ein untergeordnetes Widget unmittelbar nach dem Hinzufügen entfernt wird. Wenn ein untergeordnetes Widget während des Aufbaus und der Zerstörung mehrmals poliert wird, können Sie mehrere polierte Ereignisse für dasselbe untergeordnete Widget erhalten, jedes Mal mit einer anderen virtuellen Tabelle.

Siehe auch event().

const QObjectList &QObject::children() const

Gibt eine Liste von Unterobjekten zurück. Die Klasse QObjectList ist in der Header-Datei <QObject> wie folgt definiert:

Das erste hinzugefügte Kind ist das first Objekt in der Liste und das letzte hinzugefügte Kind ist das last Objekt in der Liste, d.h. neue Kinder werden am Ende angehängt.

Beachten Sie, dass sich die Reihenfolge der Liste ändert, wenn QWidget Kinder raised oder lowered sind. Ein Widget, das angehoben wird, wird zum letzten Objekt in der Liste, und ein Widget, das abgesenkt wird, wird zum ersten Objekt in der Liste.

Siehe auch findChild(), findChildren(), parent(), und setParent().

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)

Erzeugt eine Verbindung der angegebenen type vom signal im sender Objekt zum method im receiver Objekt. Gibt ein Handle für die Verbindung zurück, das später zum Trennen der Verbindung verwendet werden kann.

Das Verbindungshandle ist ungültig, wenn die Verbindung nicht hergestellt werden kann, z. B. weil die Parameter ungültig waren. Sie können prüfen, ob QMetaObject::Connection gültig ist, indem Sie es in ein bool umwandeln.

Diese Funktion arbeitet auf die gleiche Weise wie connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type), verwendet aber QMetaMethod, um Signal und Methode anzugeben.

Siehe auch 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)

Erzeugt eine Verbindung der angegebenen type vom signal im sender Objekt zum method im receiver Objekt. Gibt ein Handle für die Verbindung zurück, mit dem sie später wieder getrennt werden kann.

Sie müssen die Makros SIGNAL() und SLOT() verwenden, wenn Sie z. B. signal und method angeben:

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                 label,  SLOT(setNum(int)));

Dieses Beispiel stellt sicher, dass das Etikett immer den aktuellen Wert der Bildlaufleiste anzeigt. Beachten Sie, dass die Parameter signal und slots keine Variablennamen enthalten dürfen, sondern nur den Typ. Das folgende Beispiel würde z.B. nicht funktionieren und false zurückgeben:

// WRONG
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                 label, SLOT(setNum(int value)));

Ein Signal kann auch mit einem anderen Signal verbunden werden:

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

In diesem Beispiel leitet der Konstruktor MyWidget ein Signal von einer privaten Mitgliedsvariablen weiter und stellt es unter einem Namen zur Verfügung, der sich auf MyWidget bezieht.

Ein Signal kann mit vielen Slots und Signalen verbunden werden. Viele Signale können mit einem Slot verbunden sein.

Wenn ein Signal mit mehreren Slots verbunden ist, werden die Slots in der gleichen Reihenfolge aktiviert, in der die Verbindungen hergestellt wurden, wenn das Signal ausgesendet wird.

Die Funktion gibt ein QMetaObject::Connection zurück, das ein Handle zu einer Verbindung darstellt, wenn sie das Signal erfolgreich mit dem Slot verbindet. Das Verbindungshandle ist ungültig, wenn die Verbindung nicht hergestellt werden kann, z. B. wenn QObject nicht in der Lage ist, die Existenz von signal oder method zu überprüfen, oder wenn ihre Signaturen nicht kompatibel sind. Sie können prüfen, ob das Handle gültig ist, indem Sie es in ein bool umwandeln.

Standardmäßig wird für jede Verbindung, die Sie herstellen, ein Signal ausgegeben; für doppelte Verbindungen werden zwei Signale ausgegeben. Sie können alle diese Verbindungen mit einem einzigen disconnect()-Aufruf unterbrechen. Wenn Sie Qt::UniqueConnection type übergeben, wird die Verbindung nur hergestellt, wenn es sich nicht um ein Duplikat handelt. Wenn es bereits ein Duplikat gibt (genau dasselbe Signal an genau denselben Slot auf denselben Objekten), wird die Verbindung fehlschlagen und connect gibt ein ungültiges QMetaObject::Connection zurück.

Hinweis: Qt::UniqueConnections funktionieren nicht für Lambdas, Nicht-Member-Funktionen und Funktoren; sie gelten nur für Verbindungen zu Member-Funktionen.

Der optionale Parameter type beschreibt die Art der Verbindung, die hergestellt werden soll. Er bestimmt insbesondere, ob ein bestimmtes Signal sofort an einen Slot geliefert wird oder ob es in eine Warteschlange gestellt wird, um zu einem späteren Zeitpunkt geliefert zu werden. Wenn das Signal in eine Warteschlange gestellt wird, müssen die Parameter von Typen sein, die dem Meta-Objektsystem von Qt bekannt sind, da Qt die Argumente kopieren muss, um sie in einem Ereignis hinter den Kulissen zu speichern. Wenn Sie versuchen, eine Warteschlangenverbindung zu benutzen und die Fehlermeldung erhalten

QObject::connect: Cannot queue arguments of type 'MyType'
(Make sure 'MyType' is registered using qRegisterMetaType().)

rufen Sie qRegisterMetaType() auf, um den Datentyp zu registrieren, bevor Sie die Verbindung herstellen.

Hinweis: Diese Funktion ist thread-sicher.

Siehe auch disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE(), und Unterschiede zwischen String-basierten und Functor-basierten Verbindungen.

[static] template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

Diese Funktion überlastet connect().

Erstellt eine Verbindung von signal im sender Objekt zu functor und gibt ein Handle auf die Verbindung zurück.

Das Signal muss eine Funktion sein, die im Header als Signal deklariert ist. Die Slot-Funktion kann eine beliebige Funktion oder ein Funktor sein, der mit dem Signal verbunden werden kann. Eine Slot-Funktion kann mit einem bestimmten Signal verbunden werden, wenn das Signal mindestens so viele Argumente hat wie die Slot-Funktion. Es muss eine implizite Konvertierung zwischen den Typen der entsprechenden Argumente im Signal und im Slot geben.

Beispiel:

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, someFunction);

Es können auch Lambda-Ausdrücke verwendet werden:

QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
        socket->write("GET " + page + "\r\n");
    });

Die Verbindung wird automatisch getrennt, wenn der Absender zerstört wird. Sie sollten jedoch darauf achten, dass alle Objekte, die im Funktor verwendet werden, noch am Leben sind, wenn das Signal ausgesendet wird.

Aus diesem Grund ist es empfehlenswert, die Überladung von connect() zu verwenden, die ebenfalls ein QObject als Empfänger/Kontext annimmt. Es ist möglich, die Verwendung der kontextlosen Überladung zu deaktivieren, indem man das Makro QT_NO_CONTEXTLESS_CONNECT definiert.

Überladene Funktionen können mit Hilfe von qOverload aufgelöst werden.

Hinweis: Diese Funktion ist thread-sicher.

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const

Diese Funktion überlastet connect().

Verbindet signal vom Objekt sender mit dem method dieses Objekts.

Äquivalent zu connect(sender, signal, this, method, type).

Jede Verbindung, die Sie herstellen, gibt ein Signal aus, so dass doppelte Verbindungen zwei Signale ausgeben. Sie können eine Verbindung mit disconnect() unterbrechen.

Hinweis: Diese Funktion ist thread-sicher.

Siehe auch 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)

Diese Funktion überlastet connect().

Erstellt eine Verbindung von einem gegebenen type von signal in sender Objekt zu functor, um in einer bestimmten Ereignisschleife von context platziert zu werden, und gibt ein Handle auf die Verbindung zurück.

Hinweis: Qt::UniqueConnections funktionieren nicht für Lambdas, Nicht-Mitgliedsfunktionen und Funktoren; sie gelten nur für Verbindungen zu Mitgliedsfunktionen.

Das Signal muss eine Funktion sein, die im Header als Signal deklariert ist. Die Slot-Funktion kann jede Funktion oder jeder Funktor sein, der mit dem Signal verbunden werden kann. Eine Slot-Funktion kann mit einem bestimmten Signal verbunden werden, wenn das Signal mindestens so viele Argumente hat wie die Slot-Funktion. Es muss eine implizite Konvertierung zwischen den Typen der entsprechenden Argumente im Signal und im Slot geben.

Beispiel:

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, this, someFunction, Qt::QueuedConnection);

Es können auch Lambda-Ausdrücke verwendet werden:

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

Die Verbindung wird automatisch getrennt, wenn der Absender oder der Kontext zerstört wird. Sie sollten jedoch darauf achten, dass alle Objekte, die innerhalb des Funktors verwendet werden, noch am Leben sind, wenn das Signal ausgegeben wird.

Überladene Funktionen können mit Hilfe von qOverload aufgelöst werden.

Hinweis: Diese Funktion ist thread-sicher.

[static] template <typename PointerToMemberFunction> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)

Diese Funktion überlastet connect().

Erzeugt eine Verbindung des angegebenen type vom signal im sender Objekt zum method im receiver Objekt. Sie gibt einen Handle auf die Verbindung zurück, der später zum Trennen der Verbindung verwendet werden kann.

Das Signal muss eine Funktion sein, die im Header als Signal deklariert ist. Die Slot-Funktion kann eine beliebige Mitgliedsfunktion sein, die mit dem Signal verbunden werden kann. Ein Slot kann mit einem gegebenen Signal verbunden werden, wenn das Signal mindestens so viele Argumente wie der Slot hat und es eine implizite Konvertierung zwischen den Typen der entsprechenden Argumente im Signal und dem Slot gibt.

Beispiel:

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
                 label,  &QLabel::setText);

Dieses Beispiel stellt sicher, dass das Etikett immer den aktuellen Zeilentext anzeigt.

Ein Signal kann mit vielen Slots und Signalen verbunden werden. Viele Signale können mit einem Slot verbunden werden.

Wenn ein Signal mit mehreren Slots verbunden ist, werden die Slots in der gleichen Reihenfolge aktiviert, in der die Verbindung hergestellt wurde, wenn das Signal ausgegeben wird

Die Funktion gibt ein Handle zu einer Verbindung zurück, wenn sie das Signal erfolgreich mit dem Slot verbindet. Das Verbindungshandle ist ungültig, wenn die Verbindung nicht hergestellt werden kann, z. B. wenn QObject nicht in der Lage ist, die Existenz von signal zu überprüfen (wenn es nicht als Signal deklariert wurde). Sie können überprüfen, ob QMetaObject::Connection gültig ist, indem Sie es in ein bool umwandeln.

Standardmäßig wird für jede Verbindung, die Sie herstellen, ein Signal ausgegeben; für doppelte Verbindungen werden zwei Signale ausgegeben. Sie können alle diese Verbindungen mit einem einzigen disconnect()-Aufruf unterbrechen. Wenn Sie Qt::UniqueConnection type übergeben, wird die Verbindung nur hergestellt, wenn es sich nicht um ein Duplikat handelt. Wenn es bereits ein Duplikat gibt (genau dasselbe Signal an genau denselben Slot auf denselben Objekten), schlägt die Verbindung fehl und connect gibt ein ungültiges QMetaObject::Connection zurück.

Der optionale Parameter type beschreibt die Art der Verbindung, die aufgebaut werden soll. Er bestimmt insbesondere, ob ein bestimmtes Signal sofort an einen Steckplatz geliefert wird oder ob es in eine Warteschlange gestellt wird, um zu einem späteren Zeitpunkt geliefert zu werden. Wenn das Signal in eine Warteschlange gestellt wird, müssen die Parameter von Typen sein, die dem Meta-Objektsystem von Qt bekannt sind, da Qt die Argumente kopieren muss, um sie in einem Ereignis hinter den Kulissen zu speichern. Wenn Sie versuchen, eine Warteschlangenverbindung zu verwenden und die Fehlermeldung erhalten

QObject::connect: Cannot queue arguments of type 'MyType'
(Make sure 'MyType' is registered using qRegisterMetaType().)

erhalten, stellen Sie sicher, dass Sie den Argumenttyp mit Q_DECLARE_METATYPE

Überladene Funktionen können mit Hilfe von qOverload aufgelöst werden.

Hinweis: Diese Funktion ist thread-sicher.

Siehe auch Unterschiede zwischen String-basierten und Functor-basierten Verbindungen.

[virtual protected] void QObject::connectNotify(const QMetaMethod &signal)

Diese virtuelle Funktion wird aufgerufen, wenn in diesem Objekt etwas mit signal verbunden wurde.

Wenn Sie signal mit einem bestimmten Signal vergleichen wollen, können Sie QMetaMethod::fromSignal() wie folgt verwenden:

if (signal == QMetaMethod::fromSignal(&MyObject::valueChanged)) {
    // signal is valueChanged
}

Warnung! Diese Funktion verstößt gegen das objektorientierte Prinzip der Modularität. Sie kann jedoch nützlich sein, wenn Sie eine teure Initialisierung nur dann durchführen müssen, wenn etwas mit einem Signal verbunden ist.

Warnung: Diese Funktion wird von dem Thread aufgerufen, der die Verbindung herstellt, was ein anderer Thread sein kann als der Thread, in dem sich dieses Objekt befindet. Diese Funktion kann auch aufgerufen werden, wenn eine interne Mutex von QObject gesperrt ist. Es ist daher nicht erlaubt, QObject Funktionen, einschließlich isSignalConnected(), von Ihrer Neuimplementierung aus erneut aufzurufen. Wenn Sie einen Mutex in Ihrer Neuimplementierung sperren, stellen Sie sicher, dass Sie keine QObject Funktionen aufrufen, wenn dieser Mutex an anderen Stellen gehalten wird, da dies sonst zu einem Deadlock führt.

Siehe auch connect() und disconnectNotify().

[virtual protected] void QObject::customEvent(QEvent *event)

Dieser Event-Handler kann in einer Unterklasse neu implementiert werden, um benutzerdefinierte Ereignisse zu empfangen. Benutzerdefinierte Ereignisse sind benutzerdefinierte Ereignisse mit einem Typwert, der mindestens so groß ist wie das Element QEvent::User der Aufzählung QEvent::Type, und typischerweise eine QEvent Unterklasse ist. Das Ereignis wird mit dem Parameter event übergeben.

Siehe auch event() und QEvent.

[slot] void QObject::deleteLater()

Plant die Löschung dieses Objekts.

Das Objekt wird gelöscht, wenn die Kontrolle zur Ereignisschleife zurückkehrt. Wenn die Ereignisschleife nicht läuft, wenn diese Funktion aufgerufen wird (z.B. deleteLater() wird für ein Objekt vor QCoreApplication::exec() aufgerufen), wird das Objekt gelöscht, sobald die Ereignisschleife gestartet wird. Wenn deleteLater() aufgerufen wird, nachdem die Hauptereignisschleife beendet wurde, wird das Objekt nicht gelöscht. Wenn deleteLater() für ein Objekt aufgerufen wird, das sich in einem Thread befindet, in dem keine Ereignisschleife läuft, wird das Objekt zerstört, wenn der Thread beendet wird.

Beachten Sie, dass das Betreten und Verlassen einer neuen Ereignisschleife (z.B. durch das Öffnen eines modalen Dialogs) das aufgeschobene Löschen nicht durchführt; damit das Objekt gelöscht wird, muss die Kontrolle zu der Ereignisschleife zurückkehren, aus der deleteLater() aufgerufen wurde. Dies gilt nicht für Objekte, die gelöscht wurden, während eine vorherige, verschachtelte Ereignisschleife noch lief: die Qt-Ereignisschleife löscht diese Objekte, sobald die neue verschachtelte Ereignisschleife beginnt.

In Situationen, in denen Qt den Event-Dispatcher nicht über z.B. QCoreApplication::exec() oder QEventLoop::exec() ansteuert, werden aufgeschobene Löschungen nicht automatisch verarbeitet. Um eine verzögerte Löschung in diesem Szenario zu gewährleisten, kann der folgende Workaround verwendet werden:

const auto *eventDispatcher = QThread::currentThread()->eventDispatcher();
QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock,
    QThread::currentThread(), []{
        if (QThread::currentThread()->loopLevel() == 0)
            QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
    }
);

Hinweis: Diese Funktion ist thread-safe.

Siehe auch destroyed() und QPointer.

[signal] void QObject::destroyed(QObject *obj = nullptr)

Dieses Signal wird unmittelbar vor der Zerstörung des Objekts obj ausgelöst, nachdem alle Instanzen von QPointer benachrichtigt wurden, und kann nicht blockiert werden.

Alle Kinder des Objekts werden unmittelbar nach dem Aussenden dieses Signals zerstört.

Siehe auch deleteLater() und QPointer.

[static] bool QObject::disconnect(const QMetaObject::Connection &connection)

Trennen Sie eine Verbindung.

Wenn connection ungültig ist oder bereits getrennt wurde, wird nichts unternommen und false zurückgegeben.

Siehe auch connect().

[static] bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)

Trennt die Verbindung signal im Objekt sender von method im Objekt receiver. Gibt true zurück, wenn die Verbindung erfolgreich unterbrochen wurde; andernfalls false.

Diese Funktion bietet die gleichen Möglichkeiten wie disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method), verwendet aber QMetaMethod, um das Signal und die zu trennende Methode darzustellen.

Zusätzlich gibt diese Funktion false und keine Signale und Slots zurück, wenn die Verbindung getrennt wurde:

  1. signal kein Mitglied der Absenderklasse oder einer ihrer Elternklassen ist.
  2. method kein Mitglied der Empfängerklasse oder einer ihrer Elternklassen ist.
  3. signal die Instanz kein Signal darstellt.

Hinweis: Verwenden Sie die gleiche Syntax, Zeiger-auf-Member-Funktion oder String-basiert unter Verwendung der Makros SIGNAL und SLOT, in connect() und den entsprechenden disconnect()-Aufrufen.

Um Unstimmigkeiten zu vermeiden, speichern Sie das von connect() zurückgegebene Verbindungshandle und verwenden Sie es im Aufruf von disconnect().

Hinweis: Wenn eine queued connection Verbindung getrennt wird, können bereits geplante Ereignisse noch zugestellt werden, so dass der Empfänger nach dem Trennen der Verbindung aufgerufen wird.

QMetaMethod() kann als Platzhalter in der Bedeutung "jedes Signal" oder "jeder Slot im empfangenden Objekt" verwendet werden. In gleicher Weise kann nullptr für receiver in der Bedeutung "beliebiges Empfangsobjekt" verwendet werden. In diesem Fall sollte die Methode auch QMetaMethod() sein. Der Parameter sender sollte niemals nullptr sein.

Hinweis: Das Trennen aller Signal-Slot-Verbindungen unterbricht auch das QObject::destroyed()-Signal, wenn es verbunden ist. Dies kann sich nachteilig auf Klassen auswirken, die sich auf dieses Signal zum Aufräumen von Ressourcen verlassen. Es wird empfohlen, nur die spezifischen Signale zu trennen, die durch Anwendungscode verbunden wurden.

Siehe auch disconnect(const QObject *Sender, const char *Signal, const QObject *Empfänger, const char *Methode).

[static] bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

Trennt die Verbindung signal im Objekt sender von method im Objekt receiver. Gibt true zurück, wenn die Verbindung erfolgreich getrennt wurde; andernfalls false.

Eine Signal-Slot-Verbindung wird entfernt, wenn eines der beteiligten Objekte zerstört wird.

disconnect() wird typischerweise auf drei Arten verwendet, wie die folgenden Beispiele zeigen.

  1. Trennen Sie alles, was mit den Signalen eines Objekts verbunden ist:
    disconnect(myObject, nullptr, nullptr, nullptr);

    Äquivalent zur nicht-statischen überladenen Funktion

    myObject->disconnect();
  2. Trenne alles, was mit einem bestimmten Signal verbunden ist:
    disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);

    Äquivalent zur nicht statischen überladenen Funktion

    myObject->disconnect(SIGNAL(mySignal()));
  3. Trennen Sie einen bestimmten Empfänger:
    disconnect(myObject, nullptr, myReceiver, nullptr);

    Äquivalent zu der nicht statischen überladenen Funktion

    myObject->disconnect(myReceiver);

Hinweis: Verwenden Sie in connect() und den entsprechenden disconnect()-Aufrufen dieselbe Syntax, entweder als Zeiger auf eine Member-Funktion oder als String-basierte Funktion unter Verwendung der Makros SIGNAL und SLOT.

Um Unstimmigkeiten zu vermeiden, speichern Sie das von connect() zurückgegebene Verbindungshandle und verwenden Sie es im Aufruf von disconnect().

Hinweis: Wenn eine queued connection getrennt wird, können bereits geplante Ereignisse noch geliefert werden, so dass der Empfänger nach dem Trennen der Verbindung aufgerufen wird.

nullptr kann als Platzhalter verwendet werden, was "jedes Signal", "jedes empfangende Objekt" bzw. "jeder Slot im empfangenden Objekt" bedeutet.

sender darf niemals nullptr sein. (Sie können Signale nicht von mehr als einem Objekt in einem einzigen Aufruf trennen.)

Wenn signal nullptr ist, wird die Verbindung zwischen receiver und method von jedem Signal getrennt. Wenn nicht, wird nur das angegebene Signal getrennt.

Wenn receiver gleich nullptr ist, wird die Verbindung zu signal unterbrochen, andernfalls werden Slots in anderen Objekten als receiver nicht unterbrochen.

Wenn method nullptr ist, wird die Verbindung zu receiver unterbrochen. Wenn nicht, werden nur die Slots mit dem Namen method unterbrochen, alle anderen Slots bleiben unberührt. method muss nullptr sein, wenn receiver ausgelassen wird, so dass Sie nicht bei allen Objekten einen speziell benannten Steckplatz abschalten können.

Hinweis: Durch das Trennen aller Signalsteckplatzverbindungen wird auch das Signal QObject::destroyed() getrennt, falls es angeschlossen ist. Dies kann sich nachteilig auf Klassen auswirken, die auf dieses Signal zum Aufräumen von Ressourcen angewiesen sind. Es wird empfohlen, nur die spezifischen Signale zu trennen, die vom Anwendungscode verbunden wurden.

Hinweis: Diese Funktion ist thread-sicher.

Siehe auch connect().

bool QObject::disconnect(const QObject *receiver, const char *method = nullptr) const

Diese Funktion überlastet disconnect().

Trennt alle Signale in diesem Objekt von receiver's method.

Hinweis: Verwenden Sie in connect() und den entsprechenden disconnect()-Aufrufen dieselbe Syntax, entweder als Zeiger auf eine Member-Funktion oder als Zeichenkette unter Verwendung der Makros SIGNAL und SLOT.

Um Fehlanpassungen zu vermeiden, speichern Sie das von connect() zurückgegebene Verbindungshandle und verwenden Sie es im Aufruf von disconnect().

Hinweis: Wenn eine queued connection -Verbindung getrennt wird, können bereits geplante Ereignisse noch geliefert werden, so dass der Empfänger nach dem Trennen der Verbindung aufgerufen wird.

Eine Signal-Slot-Verbindung wird entfernt, wenn eines der beteiligten Objekte zerstört wird.

bool QObject::disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const

Diese Funktion überlädt disconnect().

Trennt die Verbindung zwischen signal und method von receiver.

Hinweis: Verwenden Sie in connect() und den entsprechenden disconnect()-Aufrufen dieselbe Syntax, d. h. Zeiger-auf-Member-Funktion oder String-basiert unter Verwendung der Makros SIGNAL und SLOT.

Um Fehlanpassungen zu vermeiden, speichern Sie das von connect() zurückgegebene Verbindungshandle und verwenden Sie es im Aufruf von disconnect().

Hinweis: Wenn eine queued connection -Verbindung getrennt wird, können bereits geplante Ereignisse noch geliefert werden, so dass der Empfänger nach dem Trennen der Verbindung aufgerufen wird.

Eine Signal-Slot-Verbindung wird entfernt, wenn eines der beteiligten Objekte zerstört wird.

Hinweis: Durch das Trennen aller Signalsteckplatzverbindungen wird auch das Signal QObject::destroyed() getrennt, falls es verbunden ist. Dies kann sich nachteilig auf Klassen auswirken, die auf dieses Signal zum Aufräumen von Ressourcen angewiesen sind. Es wird empfohlen, nur die spezifischen Signale zu trennen, die vom Anwendungscode verbunden wurden.

Hinweis: Diese Funktion ist thread-sicher.

[static] template <typename PointerToMemberFunction> bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)

Diese Funktion überlastet disconnect().

Trennt die Verbindung zwischen signal im Objekt sender und method im Objekt receiver. Gibt true zurück, wenn die Verbindung erfolgreich getrennt wurde; andernfalls false.

Eine Signal-Slot-Verbindung wird entfernt, wenn eines der beteiligten Objekte zerstört wird.

disconnect() wird typischerweise auf drei Arten verwendet, wie die folgenden Beispiele zeigen.

  1. Trennen Sie alles, was mit den Signalen eines Objekts verbunden ist:
    disconnect(myObject, nullptr, nullptr, nullptr);
  2. Trennen Sie alles, was mit einem bestimmten Signal verbunden ist:
    disconnect(myObject, &MyObject::mySignal(), nullptr, nullptr);
  3. Trennen Sie einen bestimmten Empfänger:
    disconnect(myObject, nullptr, myReceiver, nullptr);
  4. Trennen Sie eine Verbindung von einem bestimmten Signal zu einem bestimmten Steckplatz:
    QObject::disconnect(lineEdit, &QLineEdit::textChanged,
                     label,  &QLabel::setText);

nullptr kann als Platzhalter verwendet werden und bedeutet "jedes Signal", "jedes empfangende Objekt" bzw. "jeder Steckplatz im empfangenden Objekt".

sender darf niemals nullptr sein. (Es ist nicht möglich, Signale von mehr als einem Objekt in einem einzigen Aufruf zu trennen.)

Wenn signal nullptr ist, wird die Verbindung zwischen receiver und method von jedem Signal getrennt. Wenn nicht, wird nur das angegebene Signal getrennt.

Wenn receiver nullptr ist, wird die Verbindung zu signal unterbrochen, andernfalls werden nur die Slots des angegebenen Empfängers unterbrochen. disconnect() mit einem receiver, der nicht Null ist, unterbricht auch die Verbindung von Slot-Funktionen, die mit receiver als Kontextobjekt verbunden waren.

Wenn method nullptr ist, wird alles getrennt, was mit receiver verbunden ist. Wenn nicht, werden nur Slots mit dem Namen method getrennt und alle anderen Slots werden in Ruhe gelassen. method muss nullptr sein, wenn receiver ausgelassen wird, so dass Sie nicht bei allen Objekten einen speziell benannten Slot abschalten können.

Hinweis: Es ist nicht möglich, diese Überladung zum Trennen von Signalen zu verwenden, die mit Funktoren oder Lambda-Ausdrücken verbunden sind. Das liegt daran, dass es nicht möglich ist, sie zu vergleichen. Verwenden Sie stattdessen die Überladung, die ein QMetaObject::Connection nimmt.

Hinweis: Sofern method nicht nullptr ist, unterbricht diese Funktion auch keine Verbindungen, die mit der String-basierten Version von connect() hergestellt wurden. Um solche Verbindungen zu unterbrechen, verwenden Sie die entsprechende string-basierte Überladung von disconnect().

Hinweis: Diese Funktion ist thread-sicher.

Siehe auch connect().

[virtual protected] void QObject::disconnectNotify(const QMetaMethod &signal)

Diese virtuelle Funktion wird aufgerufen, wenn in diesem Objekt eine Verbindung zu signal getrennt wurde.

Siehe connectNotify() für ein Beispiel, wie man signal mit einem bestimmten Signal vergleicht.

Wenn alle Signale von diesem Objekt getrennt wurden (z. B. war das Signalargument für disconnect() nullptr), wird disconnectNotify() nur einmal aufgerufen, und signal ist ein ungültiges QMetaMethod (QMetaMethod::isValid() gibt false zurück ).

Warnung: Diese Funktion verstößt gegen das objektorientierte Prinzip der Modularität. Sie kann jedoch nützlich sein, um den Zugriff auf teure Ressourcen zu optimieren.

Warnung: Diese Funktion wird von dem Thread aufgerufen, der die Trennung durchführt, was ein anderer Thread sein kann als der Thread, in dem dieses Objekt lebt. Diese Funktion kann auch aufgerufen werden, wenn eine interne Mutex von QObject gesperrt ist. Es ist daher nicht erlaubt, QObject Funktionen, einschließlich isSignalConnected(), von Ihrer Neuimplementierung aus erneut aufzurufen. Wenn Sie einen Mutex in Ihrer Neuimplementierung sperren, stellen Sie sicher, dass Sie keine QObject Funktionen aufrufen, wenn dieser Mutex an anderen Stellen gehalten wird, da dies sonst zu einem Deadlock führt.

Siehe auch disconnect() und connectNotify().

void QObject::dumpObjectInfo() const

Gibt Informationen über Signalverbindungen usw. für dieses Objekt in die Debug-Ausgabe aus.

Hinweis: Vor Qt 5.9 war diese Funktion keine Konstante.

Siehe auch dumpObjectTree().

void QObject::dumpObjectTree() const

Gibt einen Baum von Kindern in die Debug-Ausgabe aus.

Hinweis: Vor Qt 5.9 war diese Funktion keine Konstante.

Siehe auch dumpObjectInfo().

QList<QByteArray> QObject::dynamicPropertyNames() const

Gibt die Namen aller Eigenschaften zurück, die dem Objekt mit setProperty() dynamisch hinzugefügt wurden.

[virtual] bool QObject::event(QEvent *e)

Diese virtuelle Funktion empfängt Ereignisse zu einem Objekt und sollte true zurückgeben, wenn das Ereignis e erkannt und verarbeitet wurde.

Die Funktion event() kann neu implementiert werden, um das Verhalten eines Objekts anzupassen.

Stellen Sie sicher, dass Sie die Implementierung der übergeordneten Ereignisklasse für alle Ereignisse aufrufen, die Sie nicht verarbeitet haben.

Beispiel:

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

Siehe auch installEventFilter(), timerEvent(), QCoreApplication::sendEvent(), und QCoreApplication::postEvent().

[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

Filtert Ereignisse, wenn dieses Objekt als Ereignisfilter für das Objekt watched installiert wurde.

Wenn Sie in Ihrer Neuimplementierung dieser Funktion event herausfiltern wollen, d. h. die weitere Bearbeitung verhindern wollen, geben Sie true zurück; andernfalls geben Sie false zurück.

Beispiel:

class MainWindow : public QMainWindow
{public: MainWindow();protected: bool eventFilter(QObject*obj, QEvent *ev) override;private:    QTextEdit *textEdit; }; HauptFenster::HauptFenster() { textEdit = new QTextEdit; setCentralWidget(textEdit);  textEdit->installEventFilter(this); }bool HauptFenster::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 { // das Ereignis an die übergeordnete Klasse weitergeben return QMainWindow::eventFilter(obj, event); } }

Beachten Sie im obigen Beispiel, dass unbehandelte Ereignisse an die Funktion eventFilter() der Basisklasse weitergegeben werden, da die Basisklasse eventFilter() für ihre eigenen internen Zwecke reimplementiert haben könnte.

Einige Ereignisse, wie z. B. QEvent::ShortcutOverride, müssen explizit akzeptiert werden (durch Aufruf von accept()), um eine Weitergabe zu verhindern.

Warnung: Wenn Sie das Empfängerobjekt in dieser Funktion löschen, achten Sie darauf, dass Sie true zurückgeben. Andernfalls wird Qt das Ereignis an das gelöschte Objekt weiterleiten und das Programm könnte abstürzen.

Siehe auch installEventFilter().

template <typename T> T QObject::findChild(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Gibt das Kind dieses Objekts zurück, das in den Typ T gecastet werden kann und das name heißt, oder nullptr, wenn es kein solches Objekt gibt. Ein Null-Argument name bewirkt, dass alle Objekte abgeglichen werden. Ein leeres, nicht-null name passt nur auf Objekte, deren objectName leer ist. Die Suche wird rekursiv durchgeführt, es sei denn, options gibt die Option FindDirectChildrenOnly an.

Wenn es mehr als ein Kind gibt, das der Suche entspricht, wird der direkteste Vorfahre zurückgegeben. Wenn es mehrere direkte Vorfahren gibt, wird das erste Kind in children() zurückgegeben. In diesem Fall ist es besser, findChildren() zu verwenden, um die vollständige Liste aller Kinder zu erhalten.

Dieses Beispiel gibt ein untergeordnetes Element QPushButton von parentWidget mit dem Namen "button1" zurück, auch wenn die Schaltfläche kein direktes untergeordnetes Element des übergeordneten Elements ist:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1");

Dieses Beispiel gibt ein QListWidget Kind von parentWidget zurück:

QListWidget *list = parentWidget->findChild<QListWidget *>();

Dieses Beispiel gibt ein Kind QPushButton von parentWidget (seinem direkten Elternteil) mit dem Namen "button1" zurück:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);

Dieses Beispiel gibt ein QListWidget Kind von parentWidget zurück, dessen direktes Elternteil:

QListWidget *list = parentWidget->findChild<QListWidget *>(Qt::FindDirectChildrenOnly);

Hinweis: In Qt-Versionen vor 6.7 nahm diese Funktion name als QString, nicht QAnyStringView.

Siehe auch findChildren().

[since 6.7] template <typename T> T QObject::findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Dies ist eine überladene Funktion.

Gibt das Kind dieses Objekts zurück, das in den Typ T gecastet werden kann, oder nullptr, wenn es kein solches Objekt gibt. Die Suche wird rekursiv durchgeführt, es sei denn, options gibt die Option FindDirectChildrenOnly an.

Wenn es mehr als ein Kind gibt, das der Suche entspricht, wird der direkteste Vorfahre zurückgegeben. Wenn es mehrere direkte Vorfahren gibt, wird das erste Kind in children() zurückgegeben. In diesem Fall ist es besser, findChildren() zu verwenden, um die komplette Liste aller Kinder zu erhalten.

Diese Funktion wurde in Qt 6.7 eingeführt.

Siehe auch findChildren().

template <typename T> QList<T> QObject::findChildren(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Gibt alle Kinder dieses Objekts mit dem angegebenen name zurück, die auf den Typ T gecastet werden können, oder eine leere Liste, wenn es keine solchen Objekte gibt. Ein Null-Argument name bewirkt, dass alle Objekte gefunden werden, ein leeres Argument nur solche, deren objectName leer ist. Die Suche wird rekursiv durchgeführt, es sei denn options gibt die Option FindDirectChildrenOnly an.

Das folgende Beispiel zeigt, wie man eine Liste der untergeordneten QWidgets des angegebenen parentWidget mit dem Namen widgetname findet:

QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");

Dieses Beispiel gibt alle QPushButtons zurück, die Kinder von parentWidget sind:

QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();

Dieses Beispiel gibt alle QPushButtons zurück, die unmittelbare Kinder von parentWidget sind:

QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(Qt::FindDirectChildrenOnly);

Hinweis: In Qt-Versionen vor 6.7 nahm diese Funktion name als QString, nicht QAnyStringView.

Siehe auch findChild().

[since 6.3] template <typename T> QList<T> QObject::findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Dies ist eine überladene Funktion.

Gibt alle Kinder dieses Objekts zurück, die auf den Typ T gecastet werden können, oder eine leere Liste, wenn es keine solchen Objekte gibt. Die Suche wird rekursiv durchgeführt, es sei denn options gibt die Option FindDirectChildrenOnly an.

Diese Funktion wurde in Qt 6.3 eingeführt.

Siehe auch findChild().

template <typename T> QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Diese Funktion überlastet findChildren().

Gibt die Kinder dieses Objekts zurück, die auf den Typ T gecastet werden können und deren Namen dem regulären Ausdruck re entsprechen, oder eine leere Liste, wenn es keine solchen Objekte gibt. Die Suche wird rekursiv durchgeführt, es sei denn, options gibt die Option FindDirectChildrenOnly an.

bool QObject::inherits(const char *className) const

Gibt true zurück, wenn dieses Objekt eine Instanz einer Klasse ist, die className erbt, oder eine QObject Unterklasse, die className erbt; andernfalls wird false zurückgegeben.

Es wird davon ausgegangen, dass eine Klasse sich selbst vererbt.

Beispiel:

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)

Wenn Sie feststellen müssen, ob ein Objekt eine Instanz einer bestimmten Klasse ist, um es zu casten, sollten Sie stattdessen qobject_cast<Type *>(object) verwenden.

Siehe auch metaObject() und qobject_cast().

void QObject::installEventFilter(QObject *filterObj)

Installiert einen Ereignisfilter filterObj auf diesem Objekt. Zum Beispiel:

monitoredObj->installEventFilter(filterObj);

Ein Ereignisfilter ist ein Objekt, das alle Ereignisse empfängt, die an dieses Objekt gesendet werden. Der Filter kann entweder das Ereignis stoppen oder es an dieses Objekt weiterleiten. Der Ereignisfilter filterObj empfängt Ereignisse über seine Funktion eventFilter(). Die Funktion eventFilter() muss true zurückgeben, wenn das Ereignis gefiltert (d. h. gestoppt) werden soll; andernfalls muss sie false zurückgeben.

Wenn mehrere Ereignisfilter auf einem Objekt installiert sind, wird der zuletzt installierte Filter zuerst aktiviert.

Wenn filterObj bereits für dieses Objekt installiert wurde, verschiebt diese Funktion es so, als ob es zuletzt installiert wurde.

Hier ist eine Klasse KeyPressEater, die die Tastendrücke ihrer überwachten Objekte aufnimmt:

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-Ereignisverarbeitung return QObject::eventFilter(obj, event); } }

Und hier ist, wie man es auf zwei Widgets installiert:

KeyPressEater *keyPressEater = new KeyPressEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView *listView = new QListView(this);

pushButton->installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);

Die Klasse QShortcut zum Beispiel verwendet diese Technik, um Tastenkombinationen abzufangen.

Achtung! Wenn Sie das Empfängerobjekt in Ihrer eventFilter() Funktion löschen, stellen Sie sicher, dass Sie true zurückgeben. Wenn Sie false zurückgeben, sendet Qt das Ereignis an das gelöschte Objekt und das Programm wird abstürzen.

Beachten Sie, dass sich das filternde Objekt im selben Thread wie dieses Objekt befinden muss. Wenn filterObj in einem anderen Thread ist, macht diese Funktion nichts. Wenn entweder filterObj oder dieses Objekt nach dem Aufruf dieser Funktion in einen anderen Thread verschoben werden, wird der Ereignisfilter nicht aufgerufen, bis beide Objekte wieder die gleiche Thread-Affinität haben (er wird nicht entfernt).

Siehe auch removeEventFilter(), eventFilter(), und event().

[since 6.4] bool QObject::isQuickItemType() const

Gibt true zurück, wenn das Objekt ein QQuickItem ist; andernfalls gibt es false zurück.

Der Aufruf dieser Funktion ist äquivalent zum Aufruf von inherits("QQuickItem"), mit dem Unterschied, dass er viel schneller ist.

Diese Funktion wurde in Qt 6.4 eingeführt.

[protected] bool QObject::isSignalConnected(const QMetaMethod &signal) const

Gibt true zurück, wenn signal mit mindestens einem Empfänger verbunden ist, andernfalls wird false zurückgegeben.

signal muss ein Signalmitglied dieses Objekts sein, ansonsten ist das Verhalten undefiniert.

static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);
if (isSignalConnected(valueChangedSignal)) {
    QByteArray data;
    data = get_the_value();       // expensive operation
    emit valueChanged(data);
}

Wie der obige Codeschnipsel zeigt, können Sie diese Funktion verwenden, um eine teure Initialisierung oder das Aussenden eines Signals zu vermeiden, auf das niemand hört. In einer Multithreading-Anwendung können sich die Verbindungen jedoch ändern, nachdem diese Funktion zurückkehrt und bevor das Signal ausgegeben wird.

Warnung: Diese Funktion verstößt gegen das objektorientierte Prinzip der Modularität. Insbesondere darf diese Funktion nicht von einer Überschreibung von connectNotify() oder disconnectNotify() aufgerufen werden, da diese von jedem Thread aus aufgerufen werden könnten.

bool QObject::isWidgetType() const

Gibt true zurück, wenn das Objekt ein Widget ist; andernfalls false.

Der Aufruf dieser Funktion ist äquivalent zum Aufruf von inherits("QWidget"), nur dass er viel schneller ist.

bool QObject::isWindowType() const

Gibt true zurück, wenn das Objekt ein Fenster ist; andernfalls false.

Der Aufruf dieser Funktion ist äquivalent zum Aufruf von inherits("QWindow"), nur dass er viel schneller ist.

void QObject::killTimer(int id)

Beendet den Zeitgeber mit der Zeitgeberkennung id.

Die Zeitgeberkennung wird von startTimer() zurückgegeben, wenn ein Zeitgeberereignis gestartet wird.

Siehe auch timerEvent() und startTimer().

[since 6.8] void QObject::killTimer(Qt::TimerId id)

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.8 eingeführt.

[virtual] const QMetaObject *QObject::metaObject() const

Gibt einen Zeiger auf das Meta-Objekt dieses Objekts zurück.

Ein Meta-Objekt enthält Informationen über eine Klasse, die QObject erbt, z. B. Klassenname, Oberklassenname, Eigenschaften, Signale und Slots. Jede QObject Unterklasse, die das Makro Q_OBJECT enthält, hat ein Meta-Objekt.

Die Meta-Objekt-Informationen werden für den Signal/Slot-Verbindungsmechanismus und das Eigenschaftssystem benötigt. Die Funktion inherits() macht ebenfalls Gebrauch vom Meta-Objekt.

Wenn Sie keinen Zeiger auf eine tatsächliche Objektinstanz haben, aber dennoch auf das Meta-Objekt einer Klasse zugreifen wollen, können Sie staticMetaObject verwenden.

Beispiel:

QObject *obj = new QPushButton;
obj->metaObject()->className();             // returns "QPushButton"

QPushButton::staticMetaObject.className();  // returns "QPushButton"

Siehe auch staticMetaObject.

bool QObject::moveToThread(QThread *targetThread)

Ändert die Thread-Affinität für dieses Objekt und seine Kinder und gibt bei Erfolg true zurück. Das Objekt kann nicht verschoben werden, wenn es einen Elternteil hat. Die Ereignisverarbeitung wird im targetThread fortgesetzt.

Um ein Objekt in den Haupt-Thread zu verschieben, verwenden Sie QApplication::instance(), um einen Zeiger auf die aktuelle Anwendung abzurufen, und verwenden Sie dann QApplication::thread(), um den Thread abzurufen, in dem sich die Anwendung befindet. Ein Beispiel:

myObject->moveToThread(QApplication::instance()->thread());

Wenn targetThread nullptr ist, wird die gesamte Ereignisverarbeitung für dieses Objekt und seine Kinder gestoppt, da sie keinem Thread mehr zugeordnet sind.

Beachten Sie, dass alle aktiven Zeitgeber für das Objekt zurückgesetzt werden. Die Zeitgeber werden zunächst im aktuellen Thread angehalten und im targetThread neu gestartet (mit demselben Intervall). Daher kann das ständige Verschieben eines Objekts zwischen Threads die Zeitgeberereignisse auf unbestimmte Zeit verschieben.

Ein QEvent::ThreadChange Ereignis wird an dieses Objekt gesendet, kurz bevor die Thread-Affinität geändert wird. Sie können dieses Ereignis behandeln, um eine spezielle Verarbeitung durchzuführen. Beachten Sie, dass alle neuen Ereignisse, die an dieses Objekt gesendet werden, im targetThread verarbeitet werden, sofern es nicht nullptr ist: Wenn es nullptr ist, kann keine Ereignisverarbeitung für dieses Objekt oder seine Kinder stattfinden, da sie nicht mehr mit einem Thread verbunden sind.

Warnung: Diese Funktion ist nicht thread-sicher; der aktuelle Thread muss gleich der aktuellen Thread-Affinität sein. Mit anderen Worten, diese Funktion kann nur ein Objekt vom aktuellen Thread zu einem anderen Thread "schieben", sie kann kein Objekt von einem beliebigen Thread zum aktuellen Thread "ziehen". Es gibt jedoch eine Ausnahme von dieser Regel: Objekte, die keine Thread-Affinität haben, können in den aktuellen Thread "gezogen" werden.

Siehe auch thread().

[private signal] void QObject::objectNameChanged(const QString &objectName)

Dieses Signal wird ausgegeben, nachdem der Name des Objekts geändert worden ist. Der neue Objektname wird als objectName übergeben.

Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, kann aber nicht vom Benutzer ausgegeben werden.

Hinweis: Benachrichtigungssignal für die Eigenschaft objectName.

Siehe auch QObject::objectName.

QObject *QObject::parent() const

Gibt einen Zeiger auf das übergeordnete Objekt zurück.

Siehe auch setParent() und children().

QVariant QObject::property(const char *name) const

Gibt den Wert der Eigenschaft name des Objekts zurück.

Wenn keine solche Eigenschaft existiert, ist die zurückgegebene Variante ungültig.

Informationen über alle verfügbaren Eigenschaften werden über die Funktionen metaObject() und dynamicPropertyNames() bereitgestellt.

Siehe auch setProperty(), QVariant::isValid(), metaObject(), und dynamicPropertyNames().

[protected] int QObject::receivers(const char *signal) const

Gibt die Anzahl der mit signal verbundenen Empfänger zurück.

Da sowohl Slots als auch Signale als Empfänger für Signale verwendet werden können und dieselben Verbindungen mehrmals hergestellt werden können, ist die Anzahl der Empfänger gleich der Anzahl der von diesem Signal hergestellten Verbindungen.

Wenn Sie diese Funktion aufrufen, können Sie das Makro SIGNAL() verwenden, um ein bestimmtes Signal zu übergeben:

if (receivers(SIGNAL(valueChanged(QByteArray))) > 0) {
    QByteArray data;
    get_the_value(&data);       // expensive operation
    emit valueChanged(data);
}

Warnung! Diese Funktion verstößt gegen das objektorientierte Prinzip der Modularität. Sie kann jedoch nützlich sein, wenn Sie eine teure Initialisierung nur dann durchführen müssen, wenn etwas mit einem Signal verbunden ist.

Siehe auch isSignalConnected().

void QObject::removeEventFilter(QObject *obj)

Entfernt ein Ereignisfilterobjekt obj aus diesem Objekt. Die Anforderung wird ignoriert, wenn ein solcher Ereignisfilter nicht installiert wurde.

Alle Ereignisfilter für dieses Objekt werden automatisch entfernt, wenn dieses Objekt zerstört wird.

Es ist immer sicher, einen Ereignisfilter zu entfernen, auch während der Aktivierung des Ereignisfilters (d.h. von der Funktion eventFilter()).

Siehe auch installEventFilter(), eventFilter(), und event().

[protected] QObject *QObject::sender() const

Gibt einen Zeiger auf das Objekt zurück, das das Signal gesendet hat, wenn es in einem durch ein Signal aktivierten Slot aufgerufen wird; andernfalls gibt es nullptr zurück. Der Zeiger ist nur während der Ausführung des Slots gültig, der diese Funktion aus dem Thread-Kontext dieses Objekts aufruft.

Der von dieser Funktion zurückgegebene Zeiger wird ungültig, wenn der Absender zerstört wird oder wenn der Slot vom Signal des Absenders getrennt wird.

Warnung: Diese Funktion verstößt gegen das objektorientierte Prinzip der Modularität. Der Zugriff auf den Absender kann jedoch nützlich sein, wenn viele Signale mit einem einzigen Slot verbunden sind.

Warnung: Wie oben erwähnt, ist der Rückgabewert dieser Funktion nicht gültig, wenn der Slot über Qt::DirectConnection von einem anderen Thread als dem dieses Objekts aufgerufen wird. Verwenden Sie diese Funktion nicht in einem solchen Szenario.

Siehe auch senderSignalIndex().

[protected] int QObject::senderSignalIndex() const

Gibt den Index der Metamethode des Signals zurück, das den aktuell ausgeführten Slot aufgerufen hat, der ein Mitglied der von sender() zurückgegebenen Klasse ist. Wird es außerhalb eines durch ein Signal aktivierten Slots aufgerufen, wird -1 zurückgegeben.

Für Signale mit Standardparametern gibt diese Funktion immer den Index mit allen Parametern zurück, unabhängig davon, welcher mit connect() verwendet wurde. Zum Beispiel hat das Signal destroyed(QObject *obj = \nullptr) zwei verschiedene Indizes (mit und ohne Parameter), aber diese Funktion gibt immer den Index mit einem Parameter zurück. Dies gilt nicht für das Überladen von Signalen mit verschiedenen Parametern.

Warnung: Diese Funktion verstößt gegen das objektorientierte Prinzip der Modularität. Allerdings kann der Zugriff auf den Signalindex nützlich sein, wenn viele Signale mit einem einzigen Slot verbunden sind.

Warnung: Der Rückgabewert dieser Funktion ist nicht gültig, wenn der Slot über einen Qt::DirectConnection von einem anderen Thread als dem dieses Objekts aufgerufen wird. Verwenden Sie diese Funktion in solchen Fällen nicht.

Siehe auch sender(), QMetaObject::indexOfSignal(), und QMetaObject::method().

void QObject::setObjectName(const QString &name)

Setzt den Namen des Objekts auf name.

Hinweis: Setter-Funktion für die Eigenschaft objectName.

Siehe auch objectName().

[since 6.4] void QObject::setObjectName(QAnyStringView name)

Dies ist eine überladene Funktion.

Hinweis: Setter-Funktion für die Eigenschaft objectName.

Diese Funktion wurde in Qt 6.4 eingeführt.

void QObject::setParent(QObject *parent)

Macht das Objekt zu einem Kind von parent.

Siehe auch parent() und children().

bool QObject::setProperty(const char *name, const QVariant &value)

Setzt den Wert der Eigenschaft name des Objekts auf value.

Wenn die Eigenschaft in der Klasse mit Q_PROPERTY definiert ist, wird bei Erfolg true zurückgegeben, andernfalls false. Wenn die Eigenschaft nicht über Q_PROPERTY definiert und daher nicht im Metaobjekt aufgeführt ist, wird sie als dynamische Eigenschaft hinzugefügt und false zurückgegeben.

Informationen über alle verfügbaren Eigenschaften werden über die Befehle metaObject() und dynamicPropertyNames() bereitgestellt.

Dynamische Eigenschaften können mit property() erneut abgefragt und durch Setzen des Eigenschaftswerts auf einen ungültigen QVariant entfernt werden. Die Änderung des Werts einer dynamischen Eigenschaft bewirkt, dass eine QDynamicPropertyChangeEvent an das Objekt gesendet wird.

Hinweis: Dynamische Eigenschaften, die mit "_q_" beginnen, sind für interne Zwecke reserviert.

Siehe auch property(), metaObject(), dynamicPropertyNames(), und QMetaProperty::write().

[since 6.6] bool QObject::setProperty(const char *name, QVariant &&value)

Diese Funktion überlastet setProperty.

Diese Funktion wurde in Qt 6.6 eingeführt.

[noexcept] bool QObject::signalsBlocked() const

Gibt true zurück, wenn Signale blockiert sind; andernfalls wird false zurückgegeben.

Signale sind standardmäßig nicht blockiert.

Siehe auch blockSignals() und QSignalBlocker.

int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)

Dies ist eine überladene Funktion, die einen Timer des Typs timerType und ein Timeout von interval Millisekunden startet. Dies ist gleichbedeutend mit einem Aufruf:

startTimer(std::chrono::milliseconds{interval}, timerType);

Siehe auch timerEvent(), killTimer(), QChronoTimer, und QBasicTimer.

int QObject::startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer)

Dies ist eine überladene Funktion.

Startet einen Zeitgeber und gibt eine Zeitgeberkennung zurück, oder gibt Null zurück, wenn kein Zeitgeber gestartet werden konnte.

Ein Timer-Ereignis tritt jedes Mal auf interval, bis killTimer() aufgerufen wird. Wenn interval gleich std::chrono::duration::zero() ist, tritt das Timer-Ereignis jedes Mal auf, wenn keine weiteren Fenstersystemereignisse zu verarbeiten sind.

Die virtuelle Funktion timerEvent() wird mit der Ereignisparameterklasse QTimerEvent aufgerufen, wenn ein Timer-Ereignis eintritt. Reimplementieren Sie diese Funktion, um Timer-Ereignisse zu erhalten.

Wenn mehrere Timer laufen, kann die Methode QTimerEvent::id() verwendet werden, um herauszufinden, welcher Timer aktiviert wurde.

Beispiel:

class MyObject : public QObject
{ Q_OBJECTpublic: 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 *Ereignis){
    qDebug() << "Timer ID:" << event->id();
}

Beachten Sie, dass die Genauigkeit des Zeitgebers vom zugrunde liegenden Betriebssystem und der Hardware abhängt.

Mit dem Argument timerType können Sie die Genauigkeit des Zeitgebers anpassen. Siehe Qt::TimerType für Informationen über die verschiedenen Timer-Typen. Die meisten Plattformen unterstützen eine Genauigkeit von 20 Millisekunden, einige bieten mehr. Wenn Qt nicht in der Lage ist, die angeforderte Anzahl von Timer-Ereignissen zu liefern, wird es einige stillschweigend verwerfen.

Die Klassen QTimer und QChronoTimer bieten eine High-Level-Programmierschnittstelle mit Single-Shot-Timern und Timer-Signalen anstelle von Ereignissen. Es gibt auch eine Klasse QBasicTimer, die leichter ist als QChronoTimer, aber weniger umständlich als die direkte Verwendung von Timer-IDs.

Hinweis: Ab Qt 6.8 ist der Typ von interval std::chrono::nanoseconds , davor war es std::chrono::milliseconds. Diese Änderung ist rückwärtskompatibel mit älteren Versionen von Qt.

Hinweis: In Qt 6.8 wurde QObject geändert, um Qt::TimerId zur Darstellung von Timer-IDs zu verwenden. Diese Methode konvertiert TimerId aus Gründen der Abwärtskompatibilität in int. Sie können jedoch Qt::TimerId verwenden, um den von dieser Methode zurückgegebenen Wert zu überprüfen:

    QObject *obj;
    ...
    const auto id = Qt::TimerId{obj->startTimer(100ms)};
    if (id != Qt::TimerId::Invalid)
        // The timer has been started successfully

Siehe auch timerEvent(), killTimer(), QChronoTimer, und QBasicTimer.

QThread *QObject::thread() const

Gibt den Thread zurück, in dem sich das Objekt befindet.

Siehe auch moveToThread().

[virtual protected] void QObject::timerEvent(QTimerEvent *event)

Dieser Event-Handler kann in einer Unterklasse neu implementiert werden, um Timer-Ereignisse für das Objekt zu empfangen.

QChronoTimer bietet Schnittstellen auf höherer Ebene zur Timer-Funktionalität und auch allgemeinere Informationen über Timer. Das Timer-Ereignis wird mit dem Parameter event übergeben.

Siehe auch startTimer(), killTimer(), und event().

[static] QString QObject::tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)

Gibt eine übersetzte Version von sourceText zurück, optional basierend auf einer disambiguation Zeichenkette und dem Wert von n für Zeichenketten, die Plurale enthalten; andernfalls wird QString::fromUtf8(sourceText) zurückgegeben, wenn keine entsprechende übersetzte Zeichenkette verfügbar ist.

Beispiel:

void SpreadSheet::setupMenuBar()
{
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    ...

Wenn dieselbe sourceText in verschiedenen Rollen innerhalb desselben Kontexts verwendet wird, kann eine zusätzliche Identifizierungszeichenfolge in disambiguation (nullptr standardmäßig) übergeben werden.

Beispiel:

MyWindow::MyWindow()
{
    QLabel *senderLabel = new QLabel(tr("Name:"));
    QLabel *recipientLabel = new QLabel(tr("Name:", "recipient"));
    ...

Siehe Writing Source Code for Translation für eine detaillierte Beschreibung der Übersetzungsmechanismen von Qt im Allgemeinen und den Abschnitt Disambiguate Identical Text für Informationen zur Disambiguierung.

Warnung: Diese Methode ist nur dann reentrant, wenn alle Übersetzer vor dem Aufruf dieser Methode installiert sind. Das Installieren oder Entfernen von Übersetzern während der Durchführung von Übersetzungen wird nicht unterstützt. Dies wird wahrscheinlich zu Abstürzen oder anderem unerwünschten Verhalten führen.

Siehe auch QCoreApplication::translate() und Internationalisierung mit Qt.

Dokumentation der Mitgliedsvariablen

const QMetaObject QObject::staticMetaObject

Diese Variable speichert das Meta-Objekt für die Klasse.

Ein Meta-Objekt enthält Informationen über eine Klasse, die QObject erbt, z. B. Klassenname, Name der Oberklasse, Eigenschaften, Signale und Slots. Jede Klasse, die das Makro Q_OBJECT enthält, hat auch ein Meta-Objekt.

Die Meta-Objekt-Informationen werden für den Signal/Slot-Verbindungsmechanismus und das Eigenschaftssystem benötigt. Die Funktion inherits() macht ebenfalls Gebrauch vom Metaobjekt.

Wenn Sie einen Zeiger auf ein Objekt haben, können Sie metaObject() verwenden, um das mit diesem Objekt verbundene Meta-Objekt abzurufen.

Beispiel:

QPushButton::staticMetaObject.className();  // returns "QPushButton"

QObject *obj = new QPushButton;
obj->metaObject()->className();             // returns "QPushButton"

Siehe auch metaObject().

Verwandte Nicht-Mitglieder

template <typename T> T qobject_cast(QObject *object)

template <typename T> T qobject_cast(const QObject *object)

Gibt die angegebene object in den Typ T umgewandelt zurück, wenn das Objekt vom Typ T (oder einer Unterklasse) ist; andernfalls wird nullptr zurückgegeben. Wenn object nullptr ist, wird auch nullptr zurückgegeben.

Die Klasse T muss (direkt oder indirekt) QObject erben und mit dem Makro Q_OBJECT deklariert werden.

Es wird davon ausgegangen, dass eine Klasse sich selbst vererbt.

Beispiel:

QObject *obj = new QTimer;          // QTimer inherits QObject

QTimer *timer = qobject_cast<QTimer *>(obj);
// timer == (QObject *)obj

QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
// button == nullptr

Die Funktion qobject_cast() verhält sich ähnlich wie die Standard-C++-Funktion dynamic_cast(), mit dem Vorteil, dass sie keine RTTI-Unterstützung benötigt und über dynamische Bibliotheksgrenzen hinweg funktioniert.

qobject_cast() kann auch in Verbindung mit Schnittstellen verwendet werden.

Warnung: Wenn T nicht mit dem Makro Q_OBJECT deklariert ist, ist der Rückgabewert dieser Funktion undefiniert.

Siehe auch QObject::inherits().

QObjectList

Synonym für QList<QObject *>.

[since 6.8] enum class TimerId

Dies wird verwendet, um Zeitgeber-IDs darzustellen (z. B. QTimer und QChronoTimer). Der zugrunde liegende Typ ist int. Sie können qToUnderlying() verwenden, um Qt::TimerId in int zu konvertieren.

KonstanteWertBeschreibung
QObject::TimerId::Invalid0Stellt eine No-Op-Timer-ID dar; ihre Verwendung hängt vom Kontext ab, z.B. ist dies der Wert, der von QObject::startTimer() zurückgegeben wird, um anzuzeigen, dass es fehlgeschlagen ist, einen Timer zu starten; während QChronoTimer::id() diesen Wert zurückgibt, wenn der Timer inaktiv ist, d.h. timer.isActive() gibt false zurück.

Dieses Enum wurde in Qt 6.8 eingeführt.

Siehe auch QTimer::id(), QChronoTimer::id(), und QObject::startTimer().

Makro-Dokumentation

[since 6.7] QT_NO_CONTEXTLESS_CONNECT

Die Definition dieses Makros deaktiviert die Überladung von QObject::connect(), die ein Signal mit einem Funktor verbindet, ohne auch ein QObject als Empfänger/Kontextobjekt anzugeben (d.h. die 3-Argumente-Überladung von QObject::connect()).

Die Verwendung der kontextlosen Überladung ist fehleranfällig, da es einfach ist, eine Verbindung zu Funktoren herzustellen, die von einem lokalen Zustand des empfangenden Endes abhängen. Wenn ein solcher lokaler Zustand zerstört wird, wird die Verbindung nicht automatisch unterbrochen.

Außerdem sind solche Verbindungen immer direkte Verbindungen, was in Multithreading-Szenarien zu Problemen führen kann (zum Beispiel, wenn das Signal von einem anderen Thread ausgegeben wird).

Dieses Makro wurde in Qt 6.7 eingeführt.

Siehe auch QObject::connect und Qt::ConnectionType.

QT_NO_NARROWING_CONVERSIONS_IN_CONNECT

Die Definition dieses Makros deaktiviert die Verengung und die Umwandlung von Fließkomma in Integral zwischen den von einem Signal übertragenen Argumenten und den von einem Steckplatz akzeptierten Argumenten, wenn das Signal und der Steckplatz unter Verwendung der PMF-basierten Syntax verbunden sind.

Siehe auch QObject::connect.

Q_CLASSINFO(Name, Value)

Dieses Makro ordnet der Klasse zusätzliche Informationen zu, die mit QObject::metaObject() verfügbar sind. Die Zusatzinformationen haben die Form einer Name Zeichenkette und einer Value Literalzeichenkette.

Beispiel:

class MyClass : public QObject
{
    Q_OBJECT
    Q_CLASSINFO("Author", "Pierre Gendron")
    Q_CLASSINFO("URL", "http://www.my-organization.qc.ca")

public:
    ...
};

Qt verwendet das Makro in Qt D-Bus und Qt Qml Modulen. Zum Beispiel können Sie bei der Definition von QML-Objekttypen in C++ eine Eigenschaft als die Standard-Eigenschaft festlegen:

Q_CLASSINFO("DefaultProperty", "content")

Siehe auch QMetaObject::classInfo(), Verwendung von Qt D-Bus Adaptoren und Definieren von QML-Typen in C++.

Q_EMIT

Verwenden Sie dieses Makro, um das Schlüsselwort emit für das Senden von Signalen zu ersetzen, wenn Sie Qt Signals and Slots mit einem Signal/Slot-Mechanismus eines Drittanbieters verwenden möchten.

Das Makro wird normalerweise verwendet, wenn no_keywords mit der Variable CONFIG in der Datei .pro angegeben wird, aber es kann auch verwendet werden, wenn no_keywords nicht angegeben ist.

Q_ENUM(...)

Dieses Makro registriert einen Enum-Typ beim Meta-Objektsystem. Es muss nach der Enum-Deklaration in einer Klasse platziert werden, die das Makro Q_OBJECT, Q_GADGET oder Q_GADGET_EXPORT enthält. Für Namespaces verwenden Sie stattdessen Q_ENUM_NS().

Ein Beispiel:

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

Enumerationen, die mit Q_ENUM deklariert werden, haben ihre QMetaEnum in dem umschließenden QMetaObject registriert. Sie können auch QMetaEnum::fromType() verwenden, um die QMetaEnum zu erhalten.

Registrierte Aufzählungen werden automatisch auch im Qt-Metatypsystem registriert, wodurch sie QMetaType bekannt werden, ohne dass Q_DECLARE_METATYPE() verwendet werden muss. Dies ermöglicht nützliche Funktionen; zum Beispiel kann man sie in Strings konvertieren, wenn sie in einem QVariant verwendet werden. Ebenso können Sie bei der Übergabe an QDebug die Namen ausgeben.

Beachten Sie, dass die Enum-Werte als vorzeichenbehaftete int im Meta-Objektsystem gespeichert werden. Das Registrieren von Enumerationen mit Werten außerhalb des für int gültigen Wertebereichs führt zu Überläufen und möglicherweise zu undefiniertem Verhalten beim Zugriff über das Meta-Objektsystem. QML, zum Beispiel, greift auf registrierte Aufzählungen über das Meta-Objektsystem zu.

Siehe auch Qt's Property System.

Q_ENUM_NS(...)

Dieses Makro registriert einen Enum-Typ beim Meta-Objektsystem. Es muss nach der Enum-Deklaration in einem Namespace platziert werden, der das Makro Q_NAMESPACE enthält. Es ist dasselbe wie Q_ENUM, aber in einem Namespace.

Enumerationen, die mit Q_ENUM_NS deklariert werden, haben ihre QMetaEnum in dem umschließenden QMetaObject registriert. Sie können auch QMetaEnum::fromType() verwenden, um die QMetaEnum zu erhalten.

Registrierte Aufzählungen werden automatisch auch im Qt-Metatypsystem registriert, wodurch sie QMetaType bekannt werden, ohne dass Q_DECLARE_METATYPE() verwendet werden muss. Dies ermöglicht nützliche Funktionen; zum Beispiel kann man sie in Strings konvertieren, wenn sie in einem QVariant verwendet werden. Ebenso können Sie bei der Übergabe an QDebug die Namen ausgeben.

Beachten Sie, dass die Enum-Werte als vorzeichenbehaftete int im Meta-Objektsystem gespeichert werden. Das Registrieren von Enumerationen mit Werten außerhalb des für int gültigen Wertebereichs führt zu Überläufen und möglicherweise zu undefiniertem Verhalten beim Zugriff über das Meta-Objektsystem. QML, zum Beispiel, greift auf registrierte Aufzählungen über das Meta-Objektsystem zu.

Siehe auch Qt's Property System.

Q_FLAG(...)

Dieses Makro registriert ein einzelnes flags type mit dem Meta-Objektsystem. Es wird typischerweise in einer Klassendefinition verwendet, um zu deklarieren, dass die Werte einer gegebenen Aufzählung als Flags verwendet und mit dem bitweisen OR-Operator kombiniert werden können. Für Namespaces verwenden Sie stattdessen Q_FLAG_NS().

Das Makro muss nach der Enum-Deklaration platziert werden. Die Deklaration des Flags-Typs erfolgt mit dem Makro Q_DECLARE_FLAGS().

Zum Beispiel wird in QItemSelectionModel das Flag SelectionFlags wie folgt deklariert:

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)
    ...
}

Hinweis: Das Q_FLAG-Makro kümmert sich um die Registrierung der einzelnen Flag-Werte im Meta-Objektsystem, so dass es nicht notwendig ist, zusätzlich zu diesem Makro Q_ENUM() zu verwenden.

Siehe auch Qt's Property System.

Q_FLAG_NS(...)

Dieses Makro registriert ein einzelnes flags type mit dem Meta-Objektsystem. Es wird in einem Namespace verwendet, der das Makro Q_NAMESPACE enthält, um zu deklarieren, dass Werte eines gegebenen Enums als Flags verwendet und mit dem bitweisen OR-Operator kombiniert werden können. Es ist dasselbe wie Q_FLAG, aber in einem Namespace.

Das Makro muss nach der Enum-Deklaration platziert werden.

Hinweis: Das Makro Q_FLAG_NS kümmert sich um die Registrierung der einzelnen Flag-Werte im Meta-Objektsystem, so dass es nicht notwendig ist, zusätzlich zu diesem Makro Q_ENUM_NS() zu verwenden.

Siehe auch Qt's Property System.

Q_GADGET

Das Q_GADGET-Makro ist eine einfachere Version des Q_OBJECT -Makros für Klassen, die nicht von QObject erben, aber dennoch einige der von QMetaObject angebotenen Reflection-Fähigkeiten nutzen möchten.

Hinweis: Diese Makroerweiterung endet mit einem private: access specifier. Wenn Sie unmittelbar nach diesem Makro Mitglieder deklarieren, werden diese Mitglieder auch privat sein. Um öffentliche (oder geschützte) Mitglieder direkt nach dem Makro hinzuzufügen, verwenden Sie einen public: (oder protected:) Zugriffsspezifizierer.

Q_GADGETs können Q_ENUM, Q_PROPERTY und Q_INVOKABLE haben, aber sie können keine Signale oder Slots haben.

Q_GADGET macht ein Klassenmitglied, staticMetaObject, verfügbar. staticMetaObject ist vom Typ QMetaObject und ermöglicht den Zugriff auf die mit Q_ENUM deklarierten Enums.

Siehe auch Q_GADGET_EXPORT.

[since 6.3] Q_GADGET_EXPORT(EXPORT_MACRO)

Das Makro Q_GADGET_EXPORT funktioniert genau wie das Makro Q_GADGET. Die zur Verfügung gestellte Variable staticMetaObject (siehe Q_GADGET) wird jedoch mit dem mitgelieferten Qualifier EXPORT_MACRO deklariert. Dies ist nützlich, wenn das Objekt aus einer dynamischen Bibliothek exportiert werden muss, die umschließende Klasse als Ganzes jedoch nicht (z. B. weil sie hauptsächlich aus Inline-Funktionen besteht).

Hinweis: Diese Makroexpansion endet mit einem private: access specifier. Wenn Sie Mitglieder unmittelbar nach diesem Makro deklarieren, sind diese Mitglieder auch privat. Um öffentliche (oder geschützte) Mitglieder direkt nach dem Makro hinzuzufügen, verwenden Sie einen public: (oder protected:) Zugriffsspezifizierer.

Ein Beispiel:

class Point {
    Q_GADGET_EXPORT(EXPORT_MACRO)
    Q_PROPERTY(int x MEMBER x)
    Q_PROPERTY(int y MEMBER y)
    ~~~

Dieses Makro wurde in Qt 6.3 eingeführt.

Siehe auch Q_GADGET und Erstellen von Shared Libraries.

Q_INTERFACES(...)

Dieses Makro teilt Qt mit, welche Schnittstellen die Klasse implementiert. Dies wird bei der Implementierung von Plugins verwendet.

Siehe auch Q_DECLARE_INTERFACE(), Q_PLUGIN_METADATA(), und How to Create Qt Plugins.

Q_INVOKABLE

Wenden Sie dieses Makro auf Deklarationen von Mitgliedsfunktionen an, damit diese über das Meta-Objektsystem aufgerufen werden können. Das Makro wird vor dem Rückgabetyp geschrieben, wie im folgenden Beispiel gezeigt:

class Window : public QWidget
{
    Q_OBJECT

public:
    Window();
    void normalMethod();
    Q_INVOKABLE void invokableMethod();
};

Die Funktion invokableMethod() ist mit Q_INVOKABLE gekennzeichnet, wodurch sie im Meta-Objektsystem registriert wird und mit QMetaObject::invokeMethod() aufgerufen werden kann. Da die Funktion normalMethod() nicht auf diese Weise registriert ist, kann sie nicht mit QMetaObject::invokeMethod() aufgerufen werden.

Wenn eine aufrufbare Mitgliedsfunktion einen Zeiger auf eine QObject oder eine Unterklasse von QObject zurückgibt und sie von QML aus aufgerufen wird, gelten besondere Eigentumsregeln. Siehe Datentypkonvertierung zwischen QML und C++ für weitere Informationen.

[since 6.0] Q_MOC_INCLUDE

Das Makro Q_MOC_INCLUDE kann innerhalb oder außerhalb einer Klasse verwendet werden und weist den Meta-Object Compiler an, ein Include hinzuzufügen.

// Put this in your code and the generated code will include this header.
Q_MOC_INCLUDE("myheader.h")

Dies ist nützlich, wenn die Typen, die Sie als Eigenschaften oder Signal/Slot-Argumente verwenden, vorwärts deklariert sind.

Dieses Makro wurde in Qt 6.0 eingeführt.

Q_NAMESPACE

Das Q_NAMESPACE-Makro kann verwendet werden, um QMetaObject Fähigkeiten zu einem Namespace hinzuzufügen.

Q_NAMESPACEs können Q_CLASSINFO, Q_ENUM_NS, Q_FLAG_NS haben, aber sie können weder Q_ENUM, Q_FLAG, Q_PROPERTY, Q_INVOKABLE, Signale noch Slots haben.

Q_NAMESPACE stellt eine externe Variable, staticMetaObject, zur Verfügung. staticMetaObject ist vom Typ QMetaObject und ermöglicht den Zugriff auf die mit Q_ENUM_NS/Q_FLAG_NS deklarierten Enums.

Ein Beispiel:

namespace test {
Q_NAMESPACE
...

Siehe auch Q_NAMESPACE_EXPORT.

Q_NAMESPACE_EXPORT(EXPORT_MACRO)

Das Makro Q_NAMESPACE_EXPORT kann verwendet werden, um einem Namespace QMetaObject Fähigkeiten hinzuzufügen.

Es funktioniert genau wie das Q_NAMESPACE Makro. Allerdings wird die externe Variable staticMetaObject, die im Namespace definiert wird, mit dem mitgelieferten Qualifier EXPORT_MACRO deklariert. Dies ist nützlich, wenn das Objekt aus einer dynamischen Bibliothek exportiert werden muss.

Ein Beispiel:

namespace test {
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
...

Siehe auch Q_NAMESPACE und Erstellen von Shared Libraries.

Q_OBJECT

Das Q_OBJECT-Makro wird verwendet, um Meta-Objekt-Funktionen zu aktivieren, wie z.B. dynamische Eigenschaften, Signale und Slots.

Sie können das Q_OBJECT-Makro zu jedem Abschnitt einer Klassendefinition hinzufügen, der seine eigenen Signale und Slots deklariert oder der andere vom Qt-Metaobjektsystem bereitgestellte Dienste nutzt.

Hinweis: Diese Makroerweiterung endet mit einem private: access specifier. Wenn Sie unmittelbar nach diesem Makro Mitglieder deklarieren, werden diese Mitglieder auch privat sein. Um öffentliche (oder geschützte) Mitglieder direkt nach dem Makro hinzuzufügen, verwenden Sie einen public: (oder protected:) Zugriffsspezifizierer.

Beispiel:

#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;
};

Hinweis: Dieses Makro erfordert, dass die Klasse eine Unterklasse von QObject ist. Verwenden Sie Q_GADGET oder Q_GADGET_EXPORT anstelle von Q_OBJECT, um die Unterstützung des Meta-Objektsystems für Enums in einer Klasse zu aktivieren, die keine QObject Unterklasse ist.

Siehe auch Meta-Objektsystem, Signale und Slots, und Qt's Property System.

Q_PROPERTY(...)

Dieses Makro wird für die Deklaration von Eigenschaften in Klassen verwendet, die von QObject erben. Eigenschaften verhalten sich wie Datenelemente der Klasse, verfügen aber über zusätzliche Funktionen, die über das Meta-Objektsystem zugänglich sind.

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

Der Eigenschaftsname und -typ sowie die Funktion READ sind erforderlich. Der Typ kann ein beliebiger Typ sein, der von QVariant unterstützt wird, oder ein benutzerdefinierter Typ. Die anderen Elemente sind optional, aber eine WRITE Funktion ist üblich. Die Attribute sind standardmäßig auf true gesetzt, mit Ausnahme von USER, das standardmäßig auf false gesetzt ist.

Ein Beispiel:

Q_PROPERTY(QString title READ title WRITE setTitle USER true)

Für weitere Details über die Verwendung dieses Makros und ein detaillierteres Beispiel für seine Verwendung, siehe die Diskussion über Qt's Property System.

Siehe auch Qt's Property System.

Q_REVISION

Wenden Sie dieses Makro auf Deklarationen von Mitgliedsfunktionen an, um sie mit einer Revisionsnummer im Meta-Objektsystem zu versehen. Das Makro wird vor dem Rückgabetyp geschrieben, wie im folgenden Beispiel gezeigt:

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

Dies ist nützlich, wenn Sie das Meta-Objektsystem verwenden, um Objekte dynamisch für eine andere API freizugeben, da Sie die Version anpassen können, die von mehreren Versionen der anderen API erwartet wird. Betrachten Sie das folgende vereinfachte Beispiel:

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

Bei Verwendung derselben Fensterklasse wie im vorherigen Beispiel würden newProperty und newMethod in diesem Code nur offengelegt werden, wenn die erwartete Version 2.1 oder höher ist.

Da alle Methoden als in der Revision 0 befindlich angesehen werden, wenn sie kein Tag haben, ist ein Tag von Q_REVISION(0) oder Q_REVISION(0, 0) ungültig und wird ignoriert.

Sie können einen oder zwei Integer-Parameter an Q_REVISION übergeben. Wenn Sie nur einen Parameter übergeben, gibt dieser nur die Minor-Version an. Dies bedeutet, dass die Hauptversion nicht angegeben wird. Wenn Sie zwei Parameter übergeben, ist der erste Parameter die Hauptversion und der zweite Parameter die Nebenversion.

Dieses Tag wird vom Meta-Objektsystem selbst nicht verwendet. Derzeit wird es nur vom Modul QtQml verwendet.

Für ein allgemeineres String-Tag, siehe QMetaMethod::tag()

Siehe auch QMetaMethod::revision().

Q_SET_OBJECT_NAME(Object)

Dieses Makro weist Object das objectName "Objekt" zu.

Es spielt keine Rolle, ob Object ein Zeiger ist oder nicht, das Makro findet das von selbst heraus.

Siehe auch QObject::objectName().

Q_SIGNAL

Dies ist ein zusätzliches Makro, mit dem Sie eine einzelne Funktion als Signal kennzeichnen können. Es kann sehr nützlich sein, vor allem, wenn Sie einen Quellcode-Parser eines Drittanbieters verwenden, der die Gruppen signals oder Q_SIGNALS nicht versteht.

Verwenden Sie dieses Makro, um das signals Schlüsselwort in Klassendeklarationen zu ersetzen, wenn Sie Qt Signals and Slots mit einem Signal/Slot-Mechanismus eines Drittanbieters verwenden möchten.

Das Makro wird normalerweise verwendet, wenn no_keywords mit der CONFIG Variable in der .pro Datei angegeben wird, aber es kann auch verwendet werden, wenn no_keywords nicht angegeben wird.

Q_SIGNALS

Verwenden Sie dieses Makro, um das Schlüsselwort signals in Klassendeklarationen zu ersetzen, wenn Sie Qt Signals and Slots mit einem Signal/Slot-Mechanismus eines Drittanbieters verwenden möchten.

Das Makro wird normalerweise verwendet, wenn no_keywords mit der Variable CONFIG in der Datei .pro angegeben wird, aber es kann auch verwendet werden, wenn no_keywords nicht angegeben ist.

Q_SLOT

Dies ist ein zusätzliches Makro, mit dem Sie eine einzelne Funktion als Slot markieren können. Es kann sehr nützlich sein, vor allem, wenn Sie einen Quellcode-Parser eines Drittanbieters verwenden, der die Gruppen slots oder Q_SLOTS nicht versteht.

Verwenden Sie dieses Makro, um das Schlüsselwort slots in Klassendeklarationen zu ersetzen, wenn Sie Qt Signals and Slots mit einem Signal/Slot-Mechanismus eines Drittanbieters verwenden möchten.

Das Makro wird normalerweise verwendet, wenn no_keywords mit der CONFIG Variable in der .pro Datei angegeben wird, aber es kann auch verwendet werden, wenn no_keywords nicht angegeben wird.

Q_SLOTS

Verwenden Sie dieses Makro, um das Schlüsselwort slots in Klassendeklarationen zu ersetzen, wenn Sie Qt Signals and Slots mit einem Signal/Slot-Mechanismus eines Drittanbieters verwenden möchten.

Das Makro wird normalerweise verwendet, wenn no_keywords mit der Variable CONFIG in der Datei .pro angegeben wird, aber es kann auch verwendet werden, wenn no_keywords nicht angegeben ist.

© 2025 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.