QObject Class
La classe QObject est la classe de base de tous les objets Qt. Plus d'informations...
Remarque : Toutes les fonctions de cette classe sont réentrantes.
Remarque : Ces fonctions sont également sûres pour les threads:
- connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
- connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const
- connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
- connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
- connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
- disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
- disconnect(const char *signal, const QObject *receiver, const char *method) const
- disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction méthode)
- deleteLater()
Propriétés
- objectName : QString
Fonctions publiques
| QObject(QObject *parent = nullptr) | |
| virtual | ~QObject() |
| QBindable<QString> | bindableObjectName() |
| bool | blockSignals(bool block) |
| const QObjectList & | children() const |
| QMetaObject::Connection | connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const |
| bool | disconnect(const QObject *receiver, const char *method = nullptr) const |
| bool | disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const |
| void | dumpObjectInfo() const |
| void | dumpObjectTree() const |
| QList<QByteArray> | dynamicPropertyNames() const |
| virtual bool | event(QEvent *e) |
| virtual bool | eventFilter(QObject *watched, QEvent *event) |
| T | findChild(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
(since 6.7) T | findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
| QList<T> | findChildren(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
(since 6.3) QList<T> | findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
| QList<T> | findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
| bool | inherits(const char *className) const |
| void | installEventFilter(QObject *filterObj) |
(since 6.11) bool | isQmlExposed() const |
(since 6.4) bool | isQuickItemType() const |
| bool | isWidgetType() const |
| bool | isWindowType() const |
| void | killTimer(int id) |
(since 6.8) void | killTimer(Qt::TimerId id) |
| virtual const QMetaObject * | metaObject() const |
| bool | moveToThread(QThread *targetThread) |
| QString | objectName() const |
| QObject * | parent() const |
| QVariant | property(const char *name) const |
| void | removeEventFilter(QObject *obj) |
| void | setObjectName(const QString &name) |
(since 6.4) void | setObjectName(QAnyStringView name) |
| void | setParent(QObject *parent) |
| bool | setProperty(const char *name, const QVariant &value) |
(since 6.6) bool | setProperty(const char *name, QVariant &&value) |
| bool | signalsBlocked() const |
| int | startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer) |
| int | startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer) |
| QThread * | thread() const |
Emplacements publics
| void | deleteLater() |
Signaux
| void | destroyed(QObject *obj = nullptr) |
| void | objectNameChanged(const QString &objectName) |
Membres publics statiques
| 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) |
Fonctions protégées
| 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) |
Non-membres apparentés
| QObjectList | |
(since 6.8) enum class | TimerId { Invalid } |
| T | qobject_cast(QObject *object) |
| T | qobject_cast(const QObject *object) |
Macros
(since 6.7) | QT_NO_CONTEXTLESS_CONNECT |
| QT_NO_NARROWING_CONVERSIONS_IN_CONNECT | |
| Q_CLASSINFO(Name, Value) | |
| Q_EMIT | |
| Q_ENUM(...) | |
| Q_ENUM_NS(...) | |
| Q_FLAG(...) | |
| Q_FLAG_NS(...) | |
| Q_GADGET | |
(since 6.3) | Q_GADGET_EXPORT(EXPORT_MACRO) |
| Q_INTERFACES(...) | |
| Q_INVOKABLE | |
(since 6.0) | Q_MOC_INCLUDE |
| Q_NAMESPACE | |
| Q_NAMESPACE_EXPORT(EXPORT_MACRO) | |
| Q_OBJECT | |
| Q_PROPERTY(...) | |
| Q_REVISION | |
| Q_SET_OBJECT_NAME(Object) | |
| Q_SIGNAL | |
| Q_SIGNALS | |
| Q_SLOT | |
| Q_SLOTS |
Description détaillée
QObject est le cœur du modèle d'objet de Qt. La caractéristique centrale de ce modèle est un mécanisme très puissant de communication transparente entre les objets, appelé " signaux" et "slots". Vous pouvez connecter un signal à un slot avec connect() et détruire la connexion avec disconnect(). Pour éviter les boucles de notification interminables, vous pouvez bloquer temporairement les signaux avec blockSignals(). Les fonctions protégées connectNotify() et disconnectNotify() permettent de suivre les connexions.
Les QObjects s'organisent en arbres d'objets. Lorsque vous créez un QObject avec un autre objet comme parent, l'objet s'ajoute automatiquement à la liste children() du parent. Le parent devient propriétaire de l'objet, c'est-à-dire qu'il supprime automatiquement ses enfants dans son destructeur. Vous pouvez rechercher un objet par son nom et éventuellement par son type en utilisant findChild() ou findChildren().
Chaque objet a un objectName() et le nom de sa classe peut être trouvé via le metaObject() correspondant (voir QMetaObject::className()). Vous pouvez déterminer si la classe de l'objet hérite d'une autre classe dans la hiérarchie de l'héritage QObject en utilisant la fonction inherits().
Lorsqu'un objet est supprimé, il émet un signal destroyed(). Vous pouvez attraper ce signal pour éviter les références pendantes aux QObjects.
Les QObjects peuvent recevoir des événements via event() et filtrer les événements d'autres objets. Voir installEventFilter() et eventFilter() pour plus de détails. Un gestionnaire de commodité, childEvent(), peut être réimplémenté pour attraper les événements des enfants.
Enfin, QObject fournit le support de base des minuteries dans Qt ; voir QChronoTimer pour le support de haut niveau des minuteries.
Notez que la macro Q_OBJECT est obligatoire pour tout objet qui implémente des signaux, des slots ou des propriétés. Vous devez également exécuter le Meta-Object Compiler sur le fichier source. Nous recommandons vivement l'utilisation de cette macro dans toutes les sous-classes de QObject, qu'elles utilisent ou non des signaux, des slots et des propriétés, car si cette macro n'est pas utilisée, certaines fonctions risquent d'avoir un comportement étrange.
Tous les Qt Widgets héritent de QObject. La fonction de commodité isWidgetType() permet de savoir si un objet est réellement un widget. Elle est beaucoup plus rapide que qobject_cast<QWidget *>(obj) ou obj->inherits("QWidget").
Certaines fonctions QObject, par exemple children(), renvoient un QObjectList. QObjectList est un typedef pour QList<QObject *>.
Affinité avec les threads
On dit d'une instance de QObject qu'elle a une affinité avec un thread, ou qu'elle vit dans un certain thread. Lorsqu'un QObject reçoit un queued signal ou un événement posté, le slot ou le gestionnaire d'événement s'exécute dans le thread dans lequel l'objet vit.
Remarque : si un QObject n'a pas d'affinité avec un thread (c'est-à-dire si thread() renvoie zéro) ou s'il vit dans un thread qui n'a pas de boucle d'événements en cours d'exécution, il ne peut pas recevoir de signaux mis en file d'attente ni d'événements postés.
Par défaut, un QObject vit dans le thread dans lequel il a été créé. L'affinité thread d'un objet peut être interrogée à l'aide de thread() et modifiée à l'aide de moveToThread().
Tous les QObjects doivent vivre dans le même thread que leur parent. Par conséquent, les QObjects doivent vivre dans le même thread que leur parent :
- setParent() échouera si les deux QObjects concernés vivent dans des threads différents.
- Lorsqu'un QObject est déplacé vers un autre thread, tous ses enfants sont automatiquement déplacés.
- moveToThread() échouera si le QObject a un parent.
- Si des QObjects sont créés dans QThread::run(), ils ne peuvent pas devenir des enfants de l'objet QThread parce que QThread ne vit pas dans le thread qui appelle QThread::run().
Remarque : les variables membres d'un QObject ne deviennent pas automatiquement ses enfants. La relation parent-enfant doit être établie soit en passant un pointeur à l'objet constructor de l'enfant, soit en appelant setParent(). Sans cette étape, les variables membres de l'objet resteront dans l'ancien thread lorsque moveToThread() sera appelé.
Pas de constructeur de copie ni d'opérateur d'affectation
QObject n'a pas de constructeur de copie ni d'opérateur d'affectation. C'est une question de conception. En fait, ils sont déclarés, mais dans une section private avec la macro Q_DISABLE_COPY(). En fait, toutes les classes Qt dérivées de QObject (directement ou indirectement) utilisent cette macro pour déclarer que leur constructeur de copie et leur opérateur d'affectation sont privés. Le raisonnement se trouve dans la discussion sur l'identité et la valeur sur la page du modèle d'objet de Qt.
La principale conséquence est que vous devriez utiliser des pointeurs vers QObject (ou vers votre sous-classe de QObject) là où vous pourriez être tenté d'utiliser votre sous-classe de QObject comme valeur. Par exemple, sans constructeur de copie, vous ne pouvez pas utiliser une sous-classe de QObject comme valeur à stocker dans l'une des classes conteneurs. Vous devez stocker des pointeurs.
Connexion automatique
Le système de méta-objets de Qt fournit un mécanisme pour connecter automatiquement les signaux et les slots entre les sous-classes de QObject et leurs enfants. Tant que les objets sont définis avec des noms d'objets appropriés et que les slots suivent une convention de nommage simple, cette connexion peut être effectuée au moment de l'exécution par la fonction QMetaObject::connectSlotsByName().
L'uic génère un code qui invoque cette fonction pour permettre la connexion automatique entre les widgets des formulaires créés avec la méthode Qt Widgets Designer. Pour plus d'informations sur l'utilisation de l'auto-connexion avec Qt Widgets Designer sont fournies dans la section Utilisation d'un fichier Designer UI dans votre application du manuel Qt Widgets Designer du manuel.
Propriétés dynamiques
Les propriétés dynamiques peuvent être ajoutées et supprimées des instances de QObject au moment de l'exécution. Les propriétés dynamiques n'ont pas besoin d'être déclarées à la compilation, mais elles offrent les mêmes avantages que les propriétés statiques et sont manipulées à l'aide de la même API - en utilisant property() pour les lire et setProperty() pour les écrire.
Les propriétés dynamiques sont prises en charge par Qt Widgets DesignerLes propriétés dynamiques sont prises en charge par Qt Widgets et les widgets standard de Qt ainsi que les formulaires créés par l'utilisateur peuvent se voir attribuer des propriétés dynamiques.
Internationalisation (I18n)
Toutes les sous-classes de QObject prennent en charge les fonctions de traduction de Qt, ce qui permet de traduire l'interface utilisateur d'une application dans différentes langues.
Pour que le texte visible par l'utilisateur puisse être traduit, il doit être enveloppé dans des appels à la fonction tr(). Ceci est expliqué en détail dans le document Écrire le code source pour la traduction.
Voir également QMetaObject, QPointer, QObjectCleanupHandler, Q_DISABLE_COPY(), et Arbres d'objets et propriété.
Documentation sur les propriétés
[bindable] objectName : QString
Note : Cette propriété prend en charge les liaisons QProperty.
Cette propriété contient le nom de cet objet
Vous pouvez trouver un objet par son nom (et son type) en utilisant findChild(). Vous pouvez trouver un ensemble d'objets avec findChildren().
qDebug("MyClass::setPrecision() : (%s) invalid precision %f", qPrintable(objectName()), newPrecision);
Par défaut, cette propriété contient une chaîne vide.
Fonctions d'accès :
| QString | objectName() const |
| void | setObjectName(const QString &name) |
| void | setObjectName(QAnyStringView name) |
Signal du notificateur :
| void | objectNameChanged(const QString &objectName) | [see note below] |
Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux mais ne peut pas être émis par l'utilisateur.
Voir également metaObject() et QMetaObject::className().
Documentation sur les fonctions membres
[explicit invokable] QObject::QObject(QObject *parent = nullptr)
Construit un objet avec l'objet parent parent.
Le parent d'un objet peut être considéré comme le propriétaire de l'objet. Par exemple, un dialog box est le parent des boutons OK et Cancel qu'il contient.
Le destructeur d'un objet parent détruit tous les objets enfants.
La définition de parent en nullptr construit un objet sans parent. Si l'objet est un widget, il deviendra une fenêtre de premier niveau.
Remarque : cette fonction peut être invoquée via le système de méta-objets et à partir de QML. Voir Q_INVOKABLE.
Voir également parent(), findChild() et findChildren().
[virtual noexcept] QObject::~QObject()
Détruit l'objet, en supprimant tous ses objets enfants.
Tous les signaux vers et depuis l'objet sont automatiquement déconnectés, et tous les événements postés en attente pour l'objet sont supprimés de la file d'attente des événements. Cependant, il est souvent plus sûr d'utiliser deleteLater() plutôt que de supprimer directement une sous-classe de QObject.
Attention : Tous les objets enfants sont supprimés. Si l'un de ces objets se trouve sur la pile ou au niveau global, votre programme se bloquera tôt ou tard. Il n'est pas recommandé de conserver des pointeurs vers des objets enfants en dehors du parent. Si vous le faites quand même, le signal destroyed() vous permet de détecter la destruction d'un objet.
Attention : La suppression d'un QObject pendant qu'il traite un événement qui lui est transmis peut entraîner un plantage. Vous ne devez pas supprimer directement le QObject s'il existe dans un thread différent de celui en cours d'exécution. Utilisez plutôt deleteLater(), qui amènera la boucle d'événements à supprimer l'objet une fois que tous les événements en attente lui auront été transmis.
Voir également deleteLater().
[noexcept] bool QObject::blockSignals(bool block)
Si block est vrai, les signaux émis par cet objet sont bloqués (c'est-à-dire que l'émission d'un signal n'invoquera rien qui lui soit connecté). Si block est faux, il n'y a pas de blocage.
La valeur de retour est la valeur précédente de signalsBlocked().
Notez que le signal destroyed() sera émis même si les signaux pour cet objet ont été bloqués.
Les signaux émis alors qu'ils sont bloqués ne sont pas mis en mémoire tampon.
Voir également signalsBlocked() et QSignalBlocker.
[virtual protected] void QObject::childEvent(QChildEvent *event)
Ce gestionnaire d'événements peut être réimplémenté dans une sous-classe pour recevoir les événements des enfants. L'événement est transmis dans le paramètre event.
QEvent::ChildAdded et QEvent::ChildRemoved sont envoyés aux objets lorsque des enfants sont ajoutés ou supprimés. Dans les deux cas, vous ne pouvez compter que sur le fait que l'enfant soit un QObject ou, si isWidgetType() renvoie true, un QWidget(en effet, dans le cas ChildAdded, l'enfant n'est pas encore entièrement construit et, dans le cas ChildRemoved, il a peut-être déjà été détruit).
QEvent::ChildPolished sont envoyés aux widgets lorsque des enfants sont polis ou lorsque des enfants polis sont ajoutés. Si vous recevez un événement "enfant poli", la construction de l'enfant est généralement terminée. Cependant, cela n'est pas garanti, et plusieurs événements de polissage peuvent être envoyés pendant l'exécution du constructeur d'un widget.
Pour chaque widget enfant, vous recevez un événement ChildAdded, zéro ou plusieurs événements ChildPolished et un événement ChildRemoved.
L'événement ChildPolished est omis si un enfant est supprimé immédiatement après avoir été ajouté. Si un enfant est poli plusieurs fois au cours de sa construction et de sa destruction, vous pouvez recevoir plusieurs événements de polissage d'enfant pour le même enfant, chaque fois avec une table virtuelle différente.
Voir aussi event().
const QObjectList &QObject::children() const
Renvoie une liste d'objets enfants. La classe QObjectList est définie dans le fichier d'en-tête <QObject> comme suit :
typedef QList<QObject*> QObjectList;
Le premier enfant ajouté est l'objet first de la liste et le dernier enfant ajouté est l'objet last de la liste, c'est-à-dire que les nouveaux enfants sont ajoutés à la fin.
Notez que l'ordre de la liste change lorsque les enfants de QWidget sont raised ou lowered. Un widget qui est élevé devient le dernier objet de la liste, et un widget qui est abaissé devient le premier objet de la liste.
Voir aussi findChild(), findChildren(), parent() et setParent().
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
Crée une connexion du type type à partir de signal dans l'objet sender jusqu'à method dans l'objet receiver. Renvoie un identifiant de la connexion qui peut être utilisé pour la déconnecter ultérieurement.
L'identifiant de la connexion sera invalide s'il n'est pas possible de créer la connexion, par exemple si les paramètres ne sont pas valides. Vous pouvez vérifier si l'adresse QMetaObject::Connection est valide en la transformant en bool.
Cette fonction fonctionne de la même manière que connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type), mais elle utilise QMetaMethod pour spécifier le signal et la méthode.
Voir aussi 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)
Crée une connexion du type type à partir de signal dans l'objet sender jusqu'à method dans l'objet receiver. Renvoie un handle à la connexion qui peut être utilisé pour la déconnecter ultérieurement.
Vous devez utiliser les macros SIGNAL() et SLOT() lorsque vous spécifiez les macros signal et method, par exemple :
QLabel *label = new QLabel; QScrollBar *scrollBar = new QScrollBar; QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));
Cet exemple garantit que l'étiquette affiche toujours la valeur actuelle de la barre de défilement. Notez que les paramètres signal et slots ne doivent pas contenir de noms de variables, mais uniquement le type. Par exemple, l'exemple suivant ne fonctionnerait pas et renverrait un message faux :
// WRONG QObject::connect(scrollBar, SIGNAL(valueChanged(int value)), label, SLOT(setNum(int value)));
Un signal peut également être connecté à un autre signal :
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())); }
Dans cet exemple, le constructeur de MyWidget relaie un signal provenant d'une variable membre privée et le rend disponible sous un nom lié à MyWidget.
Un signal peut être connecté à plusieurs slots et signaux. Plusieurs signaux peuvent être connectés à un seul slot.
Si un signal est connecté à plusieurs slots, les slots sont activés dans l'ordre dans lequel les connexions ont été faites, lorsque le signal est émis.
La fonction renvoie une adresse QMetaObject::Connection qui représente une poignée de connexion si elle réussit à connecter le signal à l'emplacement. L'identifiant de connexion sera invalide s'il ne peut pas créer la connexion, par exemple si QObject ne peut pas vérifier l'existence de signal ou method, ou si leurs signatures ne sont pas compatibles. Vous pouvez vérifier si l'identifiant est valide en le transformant en bool.
Par défaut, un signal est émis pour chaque connexion que vous établissez ; deux signaux sont émis pour les connexions dupliquées. Vous pouvez rompre toutes ces connexions avec un seul appel à disconnect(). Si vous passez l'option Qt::UniqueConnection type , la connexion ne sera établie que s'il ne s'agit pas d'un doublon. S'il existe déjà un doublon (même signal à la même place sur les mêmes objets), la connexion échouera et connect renverra une adresse invalide QMetaObject::Connection.
Remarque : Qt::UniqueConnections ne fonctionne pas pour les lambdas, les fonctions non membres et les foncteurs ; il ne s'applique qu'à la connexion aux fonctions membres.
Le paramètre optionnel type décrit le type de connexion à établir. En particulier, il détermine si un signal particulier est délivré à un slot immédiatement ou s'il est mis en file d'attente pour être délivré ultérieurement. Si le signal est mis en file d'attente, les paramètres doivent être de types connus du système de méta-objets de Qt, car Qt doit copier les arguments pour les stocker dans un événement en coulisses. Si vous essayez d'utiliser une connexion en file d'attente et que vous obtenez le message d'erreur suivant
QObject::connect: Cannot queue arguments of type 'MyType' (Make sure 'MyType' is registered using qRegisterMetaType().)
appelez qRegisterMetaType() pour enregistrer le type de données avant d'établir la connexion.
Remarque : cette fonction est à l'épreuve des threads.
Voir aussi disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE(), et Différences entre les connexions basées sur des chaînes et celles basées sur des foncteurs.
[static] template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
Crée une connexion entre signal dans l'objet sender et functor, et renvoie un identifiant à la connexion.
Le signal doit être une fonction déclarée comme signal dans l'en-tête. La fonction slot peut être n'importe quelle fonction ou foncteur qui peut être connecté au signal. Une fonction slot peut être connectée à un signal donné si le signal a au moins autant d'arguments que la fonction slot. Il doit exister une conversion implicite entre les types des arguments correspondants dans le signal et le slot.
Exemple :
void someFunction(); //... void someOtherFunction() { QPushButton *button = new QPushButton; QObject::connect(button, &QPushButton::clicked, someFunction); }
Les expressions lambda peuvent également être utilisées :
QByteArray page = "..."; QTcpSocket *socket = new QTcpSocket; socket->connectToHost("qt-project.org", 80); QObject::connect(socket, &QTcpSocket::connected, [=] () { socket->write("GET " + page + "\r\n"); });
La connexion se déconnectera automatiquement si l'expéditeur est détruit. Cependant, vous devez veiller à ce que les objets utilisés dans le foncteur soient toujours vivants lorsque le signal est émis.
Pour cette raison, il est recommandé d'utiliser la surcharge de connect() qui prend également un QObject comme récepteur/contexte. Il est possible de désactiver l'utilisation de la surcharge sans contexte en définissant la macro QT_NO_CONTEXTLESS_CONNECT.
Les fonctions surchargées peuvent être résolues à l'aide de qOverload.
Cette fonction surcharge QObject::connect().
Remarque : cette fonction est à l'épreuve des threads.
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
Connecte signal de l'objet sender à l'objet method.
Équivalent à connect(sender, signal, this, method, type).
Chaque connexion que vous établissez émet un signal, de sorte que les connexions dupliquées émettent deux signaux. Vous pouvez interrompre une connexion en utilisant disconnect().
Cette fonction surcharge QObject::connect().
Remarque : cette fonction est sûre pour les threads.
Voir aussi 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)
Crée une connexion d'un type donné de signal dans l'objet sender à functor pour être placé dans une boucle d'événement spécifique de context, et renvoie un handle à la connexion.
Remarque : Qt::UniqueConnections ne fonctionne pas pour les lambdas, les fonctions non membres et les foncteurs ; il ne s'applique qu'à la connexion aux fonctions membres.
Le signal doit être une fonction déclarée comme signal dans l'en-tête. La fonction slot peut être n'importe quelle fonction ou foncteur qui peut être connecté au signal. Une fonction slot peut être connectée à un signal donné si le signal a au moins autant d'arguments que la fonction slot. Il doit exister une conversion implicite entre les types des arguments correspondants dans le signal et le slot.
Exemple :
void someFunction(); //... void someOtherFunction() { QPushButton *button = new QPushButton; QObject::connect(button, &QPushButton::clicked, this, someFunction, Qt::QueuedConnection); }
Les expressions lambda peuvent également être utilisées :
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);
La connexion se déconnecte automatiquement si l'expéditeur ou le contexte est détruit. Toutefois, vous devez veiller à ce que les objets utilisés dans le foncteur soient toujours vivants lorsque le signal est émis.
Les fonctions surchargées peuvent être résolues à l'aide de qOverload.
Cette fonction surcharge QObject::connect().
Remarque : cette fonction est à l'épreuve des threads.
[static] template <typename PointerToMemberFunction> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
Crée une connexion du type type à partir de signal dans l'objet sender jusqu'à method dans l'objet receiver. Renvoie une poignée à la connexion qui peut être utilisée pour la déconnecter ultérieurement.
Le signal doit être une fonction déclarée comme signal dans l'en-tête. La fonction slot peut être n'importe quelle fonction membre qui peut être connectée au signal. Un slot peut être connecté à un signal donné si le signal a au moins autant d'arguments que le slot, et s'il y a une conversion implicite entre les types des arguments correspondants dans le signal et le slot.
Exemple :
QLabel *label = new QLabel; QLineEdit *lineEdit = new QLineEdit; QObject::connect(lineEdit, &QLineEdit::textChanged, label, &QLabel::setText);
Cet exemple permet de s'assurer que l'étiquette affiche toujours le texte de la ligne en cours d'édition.
Un signal peut être connecté à plusieurs slots et signaux. Plusieurs signaux peuvent être connectés à un seul slot.
Si un signal est connecté à plusieurs slots, les slots sont activés dans le même ordre que celui dans lequel la connexion a été établie, lorsque le signal est émis
La fonction renvoie un identifiant de connexion si elle réussit à connecter le signal à l'emplacement. La poignée de connexion sera invalide si elle ne peut pas créer la connexion, par exemple si QObject ne peut pas vérifier l'existence de signal (s'il n'a pas été déclaré en tant que signal). Vous pouvez vérifier si QMetaObject::Connection est valide en le transformant en bool.
Par défaut, un signal est émis pour chaque connexion que vous établissez ; deux signaux sont émis pour les connexions dupliquées. Vous pouvez interrompre toutes ces connexions avec un seul appel à disconnect(). Si vous passez l'option Qt::UniqueConnection type , la connexion ne sera établie que s'il ne s'agit pas d'un doublon. S'il existe déjà un doublon (même signal à la même place sur les mêmes objets), la connexion échouera et connect renverra une adresse invalide QMetaObject::Connection.
Le paramètre facultatif type décrit le type de connexion à établir. En particulier, il détermine si un signal particulier est délivré à un slot immédiatement ou s'il est mis en file d'attente pour être délivré ultérieurement. Si le signal est mis en file d'attente, les paramètres doivent être de types connus du système de méta-objets de Qt, car Qt doit copier les arguments pour les stocker dans un événement en coulisses. Si vous essayez d'utiliser une connexion en file d'attente et que vous obtenez le message d'erreur suivant
QObject::connect: Cannot queue arguments of type 'MyType' (Make sure 'MyType' is registered using qRegisterMetaType().)
assurez-vous de déclarer le type d'argument avec Q_DECLARE_METATYPE
Les fonctions surchargées peuvent être résolues à l'aide de qOverload.
Cette fonction surcharge QObject::connect().
Remarque : cette fonction est à l'épreuve des threads.
Voir aussi Différences entre les connexions basées sur des chaînes de caractères et celles basées sur des foncteurs.
[virtual protected] void QObject::connectNotify(const QMetaMethod &signal)
Cette fonction virtuelle est appelée lorsque quelque chose a été connecté à signal dans cet objet.
Si vous souhaitez comparer signal avec un signal spécifique, vous pouvez utiliser QMetaMethod::fromSignal() comme suit :
if (signal == QMetaMethod::fromSignal(&MyObject::valueChanged)) { // signal is valueChanged }
Avertissement : Cette fonction viole le principe de modularité orienté objet. Cependant, elle peut être utile lorsque vous devez effectuer une opération coûteuse uniquement si quelque chose est connecté à un signal.
Attention : Cette fonction est appelée depuis le thread qui effectue la connexion, qui peut être un thread différent de celui dans lequel vit cet objet. Cette fonction peut également être appelée alors qu'un mutex interne de QObject est verrouillé. Il n'est donc pas permis de réintroduire les fonctions QObject, y compris isSignalConnected(), à partir de votre réimplémentation. Si vous verrouillez un mutex dans votre réimplémentation, assurez-vous que vous n'appelez pas les fonctions QObject avec ce mutex détenu à d'autres endroits ou cela résultera en un blocage.
Voir aussi connect() et disconnectNotify().
[virtual protected] void QObject::customEvent(QEvent *event)
Ce gestionnaire d'événements peut être réimplémenté dans une sous-classe pour recevoir des événements personnalisés. Les événements personnalisés sont des événements définis par l'utilisateur avec une valeur de type au moins aussi grande que l'élément QEvent::User de l'énumération QEvent::Type, et il s'agit généralement d'une sous-classe QEvent. L'événement est transmis dans le paramètre event.
[slot] void QObject::deleteLater()
Planifie la suppression de cet objet.
L'objet sera supprimé lorsque le contrôle reviendra à la boucle d'événements. Si la boucle d'événements n'est pas en cours d'exécution lorsque cette fonction est appelée (par exemple, deleteLater() est appelée sur un objet avant QCoreApplication::exec()), l'objet sera supprimé une fois que la boucle d'événements sera lancée. Si deleteLater() est appelée après l'arrêt de la boucle événementielle principale, l'objet ne sera pas supprimé. Si deleteLater() est appelé sur un objet qui vit dans un thread sans boucle d'événements en cours, l'objet sera détruit lorsque le thread se terminera.
Un schéma courant lors de l'utilisation d'un worker QObject dans un QThread est de connecter le signal finished() du thread au slot deleteLater() du worker afin de s'assurer qu'il est supprimé en toute sécurité :
Notez que l'entrée et la sortie d'une nouvelle boucle d'événements (par exemple, en ouvrant une boîte de dialogue modale) n' effectuera pas la suppression différée ; pour que l'objet soit supprimé, le contrôle doit revenir à la boucle d'événements à partir de laquelle deleteLater() a été appelé. Cela ne s'applique pas aux objets supprimés alors qu'une boucle d'événements imbriquée précédente était encore en cours d'exécution : la boucle d'événements de Qt supprimera ces objets dès que la nouvelle boucle d'événements imbriquée commencera.
Dans les situations où Qt XML ne pilote pas le distributeur d'événements via, par exemple, QCoreApplication::exec() ou QEventLoop::exec(), les suppressions différées ne seront pas traitées automatiquement. Pour garantir la suppression différée dans ce scénario, la solution de contournement suivante peut être utilisée :
const auto *eventDispatcher = QThread::currentThread()->eventDispatcher(); QObject::connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, QThread::currentThread(), []{ if (QThread::currentThread()->loopLevel() == 0) QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); } );
Remarque : cette fonction est à l'épreuve des threads.
Voir également destroyed() et QPointer.
[signal] void QObject::destroyed(QObject *obj = nullptr)
Ce signal est émis immédiatement avant la destruction de l'objet obj, après que toutes les instances de QPointer ont été notifiées, et ne peut pas être bloqué.
Tous les enfants de l'objet sont détruits immédiatement après l'émission de ce signal.
Voir aussi deleteLater() et QPointer.
[static] bool QObject::disconnect(const QMetaObject::Connection &connection)
Déconnexion d'une connexion.
Si connection n'est pas valide ou a déjà été déconnecté, ne rien faire et retourner false.
Voir aussi connect().
[static] bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
Déconnecte signal dans l'objet sender de method dans l'objet receiver. Renvoie true si la connexion est rompue avec succès ; sinon, renvoie false.
Cette fonction offre les mêmes possibilités que disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method) mais utilise QMetaMethod pour représenter le signal et la méthode à déconnecter.
En outre, cette fonction renvoie false, aucun signal et les slots déconnectés si :
- signal n'est pas membre de la classe de l'émetteur ou de l'une de ses classes parentes.
- method n'est pas membre de la classe des récepteurs ou de l'une de ses classes mères.
- signal l'instance ne représente pas un signal.
Remarque : utilisez la même syntaxe, pointeur vers une fonction membre ou basée sur une chaîne de caractères en utilisant les macros SIGNAL et SLOT, dans connect() et les appels disconnect() correspondants.
Pour éviter les incohérences, stockez la poignée de connexion renvoyée par connect() et utilisez-la dans l'appel à disconnect().
Remarque : si un site queued connection est déconnecté, des événements déjà programmés peuvent encore être délivrés, ce qui entraîne l'appel du récepteur après la déconnexion de la connexion.
QMetaMethod() peut être utilisé comme joker dans la signification "tout signal" ou "tout emplacement dans l'objet récepteur". De la même manière, nullptr peut être utilisé pour receiver dans le sens "tout objet récepteur". Dans ce cas, la méthode doit également être QMetaMethod(). Le paramètre sender ne doit jamais être nullptr.
Remarque : la déconnexion de toutes les connexions de fente de signal déconnectera également le signal QObject::destroyed() s'il est connecté. Cela peut avoir des conséquences négatives pour les classes qui dépendent de ce signal pour le nettoyage des ressources. Il est recommandé de ne déconnecter que les signaux spécifiques qui ont été connectés par le code de l'application.
Voir aussi disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method).
[static] bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
Déconnecte signal dans l'objet sender de method dans l'objet receiver. Renvoie true si la connexion est rompue avec succès ; sinon, renvoie false.
Une connexion de type signal-slot est supprimée lorsque l'un ou l'autre des objets concernés est détruit.
disconnect() est typiquement utilisé de trois façons, comme le montrent les exemples suivants.
- Déconnecter tout ce qui est connecté aux signaux d'un objet :
QObject::disconnect(myObject, nullptr, nullptr, nullptr);
équivalent à la fonction surchargée non statique
myObject->disconnect();
- Déconnecter tout ce qui est connecté à un signal spécifique :
QObject::disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);
équivalent à la fonction surchargée non statique
myObject->disconnect(SIGNAL(mySignal()));
- Déconnecter un récepteur spécifique :
QObject::disconnect(myObject, nullptr, myReceiver, nullptr);
équivalent à la fonction surchargée non statique
myObject->disconnect(myReceiver);
Remarque : utilisez la même syntaxe, pointeur vers une fonction membre ou basée sur une chaîne de caractères à l'aide des macros SIGNAL et SLOT, dans connect() et les appels disconnect() correspondants.
Pour éviter les incohérences, stockez la poignée de connexion renvoyée par connect() et utilisez-la dans l'appel à disconnect().
Remarque : si un site queued connection est déconnecté, des événements déjà programmés peuvent encore être délivrés, ce qui fait que le récepteur est appelé après la déconnexion de la connexion.
nullptr peut être utilisé comme un joker, signifiant "tout signal", "tout objet récepteur" ou "tout emplacement dans l'objet récepteur", respectivement.
Le sender ne peut jamais être nullptr(vous ne pouvez pas déconnecter les signaux de plus d'un objet en un seul appel).
Si signal est nullptr, il déconnecte receiver et method de tout signal. Sinon, seul le signal spécifié est déconnecté.
Si receiver est nullptr, il déconnecte tout ce qui est connecté à signal. Sinon, les slots des objets autres que receiver ne sont pas déconnectés.
Si method est nullptr, tout ce qui est connecté à receiver est déconnecté. Sinon, seuls les slots nommés method sont déconnectés, et tous les autres slots sont laissés en l'état. L'adresse method doit être nullptr si l'adresse receiver est omise, de sorte qu'il n'est pas possible de déconnecter un emplacement nommé spécifiquement sur tous les objets.
Remarque : la déconnexion de toutes les connexions de fentes de signal déconnectera également le signal QObject::destroyed() s'il est connecté. Cela peut avoir des conséquences négatives pour les classes qui dépendent de ce signal pour le nettoyage des ressources. Il est recommandé de ne déconnecter que les signaux spécifiques qui ont été connectés par le code de l'application.
Remarque : cette fonction est à l'épreuve des threads.
Voir également connect().
bool QObject::disconnect(const QObject *receiver, const char *method = nullptr) const
Déconnecte tous les signaux de cet objet de receiver's method.
Remarque : utilisez la même syntaxe, pointeur vers une fonction membre ou basée sur une chaîne de caractères en utilisant les macros SIGNAL et SLOT, dans connect() et les appels disconnect() correspondants.
Pour éviter les incohérences, stockez la poignée de connexion renvoyée par connect() et utilisez-la dans l'appel à disconnect().
Remarque : si un site queued connection est déconnecté, des événements déjà planifiés peuvent encore être délivrés, ce qui entraîne l'appel du récepteur après la déconnexion de la connexion.
Une connexion de fente de signal est supprimée lorsque l'un ou l'autre des objets concernés est détruit.
Cette fonction surcharge QObject::disconnect().
bool QObject::disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const
Déconnecte signal de method de receiver.
Remarque : utilisez la même syntaxe, pointeur vers une fonction membre ou basée sur une chaîne de caractères à l'aide des macros SIGNAL et SLOT, dans connect() et les appels disconnect() correspondants.
Pour éviter les incohérences, stockez la poignée de connexion renvoyée par connect() et utilisez-la dans l'appel à disconnect().
Remarque : si un site queued connection est déconnecté, des événements déjà planifiés peuvent encore être délivrés, ce qui entraîne l'appel du récepteur après la déconnexion de la connexion.
Une connexion de créneau de signalisation est supprimée lorsque l'un des objets concernés est détruit.
Remarque : la déconnexion de toutes les connexions de fente de signal déconnectera également le signal QObject::destroyed() s'il est connecté. Cela peut avoir un effet négatif sur les classes qui dépendent de ce signal pour le nettoyage des ressources. Il est recommandé de ne déconnecter que les signaux spécifiques qui ont été connectés par le code de l'application.
Cette fonction surcharge QObject::disconnect().
Remarque : cette fonction est à l'épreuve des threads.
[static] template <typename PointerToMemberFunction> bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
Déconnecte signal dans l'objet sender de method dans l'objet receiver. Renvoie true si la connexion est rompue avec succès ; sinon, renvoie false.
Une connexion de type signal-slot est supprimée lorsque l'un ou l'autre des objets concernés est détruit.
disconnect() est typiquement utilisé de trois façons, comme le montrent les exemples suivants.
- Déconnecter tout ce qui est connecté aux signaux d'un objet :
QObject::disconnect(myObject, nullptr, nullptr, nullptr);
- Déconnecter tout ce qui est connecté à un signal spécifique :
QObject::disconnect(myObject, &MyObject::mySignal, nullptr, nullptr);
- Déconnecter un récepteur spécifique :
QObject::disconnect(myObject, nullptr, myReceiver, nullptr);
- Déconnecter une connexion d'un signal spécifique à un emplacement spécifique :
nullptr peut être utilisé comme un joker, signifiant respectivement "tout signal", "tout objet récepteur" ou "tout emplacement dans l'objet récepteur".
Le sender ne peut jamais être nullptr(vous ne pouvez pas déconnecter les signaux de plus d'un objet en un seul appel).
Si signal est nullptr, il déconnecte receiver et method de tout signal. Sinon, seul le signal spécifié est déconnecté.
Si receiver est nullptr, il déconnecte tout ce qui est connecté à signal. Sinon, seuls les slots du récepteur spécifié sont déconnectés. disconnect() avec un receiver non nul déconnecte également les fonctions slot qui étaient connectées avec receiver comme objet de contexte.
Si method est nullptr, il déconnecte tout ce qui est connecté à receiver. Sinon, seuls les slots nommés method seront déconnectés, et tous les autres slots seront laissés tranquilles. L'adresse method doit être nullptr si l'adresse receiver est omise, de sorte qu'il n'est pas possible de déconnecter un slot nommé spécifiquement sur tous les objets.
Remarque : il n'est pas possible d'utiliser cette surcharge pour déconnecter des signaux connectés à des foncteurs ou à des expressions lambda. En effet, il n'est pas possible de les comparer. Utilisez plutôt la surcharge qui prend un QMetaObject::Connection.
Remarque : à moins que method ne soit nullptr, cette fonction ne rompt pas non plus les connexions établies à l'aide de la version de connect() basée sur les chaînes de caractères. Pour rompre de telles connexions, utilisez la surcharge correspondante de disconnect() basée sur une chaîne de caractères.
Cette fonction surcharge QObject::disconnect().
Remarque : cette fonction est sûre pour les threads.
Voir aussi connect().
[virtual protected] void QObject::disconnectNotify(const QMetaMethod &signal)
Cette fonction virtuelle est appelée lorsque quelque chose a été déconnecté de signal dans cet objet.
Voir connectNotify() pour un exemple de comparaison de signal avec un signal spécifique.
Si tous les signaux ont été déconnectés de cet objet (par exemple, le signal argument de disconnect() était nullptr), disconnectNotify() n'est appelé qu'une seule fois, et signal sera un QMetaMethod invalide (QMetaMethod::isValid() renvoie false).
Attention : Cette fonction viole le principe de modularité orienté objet. Cependant, elle peut être utile pour optimiser l'accès à des ressources coûteuses.
Attention : Cette fonction est appelée depuis le thread qui effectue la déconnexion, qui peut être un thread différent de celui dans lequel vit cet objet. Cette fonction peut également être appelée alors qu'un mutex interne de QObject est verrouillé. Il n'est donc pas permis de réintroduire les fonctions QObject, y compris isSignalConnected(), à partir de votre réimplémentation. Si vous verrouillez un mutex dans votre réimplémentation, assurez-vous que vous n'appelez pas les fonctions QObject avec ce mutex détenu à d'autres endroits ou cela résultera en un blocage.
Voir aussi disconnect() et connectNotify().
void QObject::dumpObjectInfo() const
Fournit des informations sur les connexions de signaux, etc. pour cet objet sur la sortie de débogage.
Note : Avant Qt 5.9, cette fonction n'était pas const.
Voir aussi dumpObjectTree().
void QObject::dumpObjectTree() const
Affiche un arbre d'enfants sur la sortie de débogage.
Note : Avant Qt 5.9, cette fonction n'était pas const.
Voir aussi dumpObjectInfo().
QList<QByteArray> QObject::dynamicPropertyNames() const
Renvoie les noms de toutes les propriétés qui ont été ajoutées dynamiquement à l'objet à l'aide de setProperty().
[virtual] bool QObject::event(QEvent *e)
Cette fonction virtuelle reçoit les événements d'un objet et renvoie un message vrai si l'événement e a été reconnu et traité.
La fonction event() peut être réimplémentée pour personnaliser le comportement d'un objet.
Veillez à appeler l'implémentation de la classe d'événement parent pour tous les événements que vous n'avez pas traités.
Exemple :
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); } };
Voir également installEventFilter(), timerEvent(), QCoreApplication::sendEvent() et QCoreApplication::postEvent().
[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)
Filtre les événements si cet objet a été installé comme filtre d'événement pour l'objet watched.
Dans votre réimplémentation de cette fonction, si vous souhaitez filtrer l'objet event, c'est-à-dire ne plus le traiter, renvoyez true ; sinon, renvoyez false.
Exemple :
classe MainWindow : public QMainWindow {public: MainWindow() ;protected: bool eventFilter(QObject*obj, QEvent *ev) override ;private: QTextEdit *textEdit; } ; MainWindow::MainWindow() { textEdit = new QTextEdit; setCentralWidget(textEdit) ; textEdit->installEventFilter(this) ; }bool MainWindow::eventFilter(QObject*obj, QEvent *event) { if (obj == textEdit) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event) ; qDebug() << "Ate key press" << keyEvent->key(); return true; } else { return false; } else { // transmettre l'événement à la classe mère return QMainWindow::eventFilter(obj, event) ; } }
Remarquez dans l'exemple ci-dessus que les événements non gérés sont transmis à la fonction eventFilter() de la classe de base, puisque cette dernière peut avoir réimplémenté eventFilter() pour ses propres besoins internes.
Certains événements, tels que QEvent::ShortcutOverride, doivent être explicitement acceptés (en appelant accept() sur eux) afin d'éviter la propagation.
Attention : Si vous supprimez l'objet récepteur dans cette fonction, assurez-vous de renvoyer true. Sinon, Qt transmettra l'événement à l'objet supprimé et le programme risque de se planter.
Voir aussi installEventFilter().
template <typename T> T QObject::findChild(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Renvoie l'enfant de cet objet qui peut être coulé dans le type T et qui est appelé name, ou nullptr s'il n'existe pas d'objet de ce type. Un argument name nul entraîne la correspondance avec tous les objets. Un argument name vide et non nul ne correspond qu'aux objets dont l'argument objectName est vide. La recherche est effectuée de manière récursive, sauf si options spécifie l'option FindDirectChildrenOnly.
Si plusieurs enfants correspondent à la recherche, l'ancêtre le plus direct est renvoyé. S'il y a plusieurs ancêtres les plus directs, le premier enfant dans children() sera renvoyé. Dans ce cas, il est préférable d'utiliser findChildren() pour obtenir la liste complète de tous les enfants.
Cet exemple renvoie un enfant QPushButton de parentWidget nommé "button1", même si le bouton n'est pas un enfant direct du parent :
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
Cet exemple renvoie un enfant QListWidget de parentWidget:
QListWidget *list = parentWidget->findChild<QListWidget *>();
Cet exemple renvoie un enfant QPushButton de parentWidget (son parent direct) nommé "button1":
QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);
Cet exemple renvoie un enfant QListWidget de parentWidget, son parent direct :
QListWidget *list = parentWidget->findChild<QListWidget *>(Qt::FindDirectChildrenOnly);
Note : Dans les versions de Qt antérieures à la 6.7, cette fonction prenait name comme QString, et non QAnyStringView.
Voir aussi findChildren().
[since 6.7] template <typename T> T QObject::findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Renvoie l'enfant de cet objet qui peut être converti en type T, ou nullptr s'il n'existe pas d'objet de ce type. La recherche est effectuée de manière récursive, sauf si options spécifie l'option FindDirectChildrenOnly.
S'il y a plus d'un enfant correspondant à la recherche, l'ancêtre le plus direct est renvoyé. S'il y a plusieurs ancêtres les plus directs, le premier enfant dans children() sera renvoyé. Dans ce cas, il est préférable d'utiliser findChildren() pour obtenir la liste complète de tous les enfants.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.7.
Voir aussi findChildren().
template <typename T> QList<T> QObject::findChildren(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Retourne tous les enfants de cet objet avec le name donné qui peuvent être castés vers le type T, ou une liste vide s'il n'y a pas de tels objets. Si l'argument name est nul, tous les objets seront recherchés, s'il est vide, seuls les objets dont objectName est vide seront recherchés. La recherche est effectuée de manière récursive, sauf si options spécifie l'option FindDirectChildrenOnly.
L'exemple suivant montre comment trouver une liste d'enfants QWidgets de l'objet parentWidget spécifié, nommé widgetname:
Cet exemple renvoie toutes les adresses QPushButtonqui sont des enfants de parentWidget:
QList<QPushButton *> allPButtons = parentWidget->findChildren<QPushButton *>();
Cet exemple renvoie tous les QPushButtonqui sont des enfants immédiats de parentWidget:
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(Qt::FindDirectChildrenOnly);
Note : Dans les versions de Qt antérieures à 6.7, cette fonction prenait name comme QString, et non QAnyStringView.
Voir aussi findChild().
[since 6.3] template <typename T> QList<T> QObject::findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Renvoie tous les enfants de cet objet qui peuvent être transformés en type T, ou une liste vide s'il n'y a pas d'objets de ce type. La recherche est effectuée de manière récursive, sauf si options spécifie l'option FindDirectChildrenOnly.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.3.
Voir aussi findChild().
template <typename T> QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Renvoie les enfants de cet objet qui peuvent être de type T et dont les noms correspondent à l'expression régulière re, ou une liste vide s'il n'y a pas d'objets de ce type. La recherche est effectuée de manière récursive, sauf si options spécifie l'option FindDirectChildrenOnly.
Cette fonction surcharge QObject::findChildren().
bool QObject::inherits(const char *className) const
Renvoie true si cet objet est une instance d'une classe qui hérite de className ou d'une sous-classe de QObject qui hérite de className; sinon, renvoie false.
Une classe est considérée comme héritant d'elle-même.
Exemple :
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)
Si vous devez déterminer si un objet est une instance d'une classe particulière dans le but de le couler, utilisez plutôt qobject_cast<Type *>(objet).
Voir également metaObject() et qobject_cast().
void QObject::installEventFilter(QObject *filterObj)
Installe un filtre d'événement filterObj sur cet objet. Par exemple :
monitoredObj->installEventFilter(filterObj);
Un filtre d'événements est un objet qui reçoit tous les événements envoyés à cet objet. Le filtre peut soit arrêter l'événement, soit le transmettre à cet objet. Le filtre d'événements filterObj reçoit les événements par l'intermédiaire de sa fonction eventFilter(). La fonction eventFilter() doit renvoyer true si l'événement doit être filtré (c'est-à-dire arrêté) ; sinon, elle doit renvoyer false.
Si plusieurs filtres d'événements sont installés sur un même objet, le filtre installé en dernier est activé en premier.
Si filterObj a déjà été installé pour cet objet, cette fonction le déplace pour qu'il agisse comme s'il avait été installé en dernier.
Voici une classe KeyPressEater qui se nourrit des pressions sur les touches des objets qu'elle surveille :
class KeyPressEater : public QObject { Q_OBJECTpublic: KeyPressEater(QObject *parent = nullptr) : QObject(parent) {}//...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 { // traitement standard des événements return QObject::eventFilter(obj, event) ; } }
Et voici comment l'installer sur deux widgets :
KeyPressEater *keyPressEater = new KeyPressEater(this); QPushButton *pushButton = new QPushButton(this); QListView *listView = new QListView(this); pushButton->installEventFilter(keyPressEater); listView->installEventFilter(keyPressEater);
La classe QShortcut, par exemple, utilise cette technique pour intercepter les pressions sur les touches de raccourci.
Attention : Si vous supprimez l'objet récepteur dans votre fonction eventFilter(), assurez-vous de renvoyer true. Si vous renvoyez false, Qt envoie l'événement à l'objet supprimé et le programme se bloque.
Notez que l'objet filtrant doit être dans le même thread que cet objet. Si filterObj se trouve dans un autre thread, cette fonction ne fait rien. Si filterObj ou cet objet sont déplacés dans un thread différent après l'appel de cette fonction, le filtre d'événement ne sera pas appelé jusqu'à ce que les deux objets aient à nouveau la même affinité de thread (il n' est pas supprimé).
Voir également removeEventFilter(), eventFilter() et event().
[noexcept, since 6.11] bool QObject::isQmlExposed() const
Retourne si l'objet a été créé par le moteur QML ou si la propriété a été explicitement définie via QJSEngine::setObjectOwnership().
Cette fonction a été introduite dans Qt 6.11.
[since 6.4] bool QObject::isQuickItemType() const
Renvoie true si l'objet est un QQuickItem; sinon, renvoie false.
L'appel à cette fonction est équivalent à l'appel à inherits("QQuickItem"), sauf qu'il est beaucoup plus rapide.
Cette fonction a été introduite dans Qt 6.4.
[protected] bool QObject::isSignalConnected(const QMetaMethod &signal) const
Renvoie true si signal est connecté à au moins un récepteur, sinon false.
signal doit être un membre signal de cet objet, sinon le comportement est indéfini.
static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged); if (QObject::isSignalConnected(valueChangedSignal)) { QByteArray data; data = get_the_value(); // expensive operation emit valueChanged(data); }
Comme l'illustre l'extrait de code ci-dessus, vous pouvez utiliser cette fonction pour éviter des opérations coûteuses ou l'émission d'un signal que personne n'écoute.
Attention : Dans une application multithread, les appels consécutifs à cette fonction ne sont pas garantis de donner les mêmes résultats.
Attention : Cette fonction viole le principe de modularité orienté objet. En particulier, cette fonction ne doit pas être appelée à partir d'une surcharge de connectNotify() ou disconnectNotify(), car celles-ci pourraient être appelées à partir de n'importe quel thread.
Voir aussi receivers().
bool QObject::isWidgetType() const
Renvoie true si l'objet est un widget ; sinon, renvoie false.
L'appel à cette fonction est équivalent à l'appel à inherits("QWidget"), sauf qu'il est beaucoup plus rapide.
bool QObject::isWindowType() const
Renvoie true si l'objet est une fenêtre ; sinon, renvoie false.
L'appel à cette fonction est équivalent à l'appel à inherits("QWindow"), sauf qu'il est beaucoup plus rapide.
void QObject::killTimer(int id)
Tue la minuterie dont l'identifiant est id.
L'identifiant de la minuterie est renvoyé par startTimer() lorsqu'un événement de minuterie est lancé.
Voir aussi timerEvent() et startTimer().
[since 6.8] void QObject::killTimer(Qt::TimerId id)
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.8.
[virtual] const QMetaObject *QObject::metaObject() const
Renvoie un pointeur sur le méta-objet de cet objet.
Un méta-objet contient des informations sur une classe qui hérite de QObject, par exemple le nom de la classe, le nom de la superclasse, les propriétés, les signaux et les emplacements. Chaque sous-classe QObject qui contient la macro Q_OBJECT aura un méta-objet.
Les informations relatives au méta-objet sont nécessaires au mécanisme de connexion signal/emplacement et au système de propriétés. La fonction inherits() utilise également le méta-objet.
Si vous n'avez pas de pointeur sur une instance d'objet réelle mais que vous souhaitez néanmoins accéder au méta-objet d'une classe, vous pouvez utiliser staticMetaObject.
Exemple :
QObject *obj = new QPushButton; obj->metaObject()->className(); // returns "QPushButton" QPushButton::staticMetaObject.className(); // returns "QPushButton"
Voir aussi staticMetaObject.
bool QObject::moveToThread(QThread *targetThread)
Modifie l'affinité des threads pour cet objet et ses enfants et renvoie true en cas de succès. L'objet ne peut pas être déplacé s'il a un parent. Le traitement des événements se poursuivra dans le thread principal targetThread.
Pour déplacer un objet vers le thread principal, utilisez QApplication::instance() pour récupérer un pointeur sur l'application en cours, puis utilisez QApplication::thread() pour récupérer le thread dans lequel se trouve l'application. Par exemple :
myObject->moveToThread(QApplication::instance()->thread());
Si targetThread est nullptr, tous les traitements d'événements pour cet objet et ses enfants s'arrêtent, car ils ne sont plus associés à aucun thread.
Notez que toutes les minuteries actives pour l'objet seront réinitialisées. Les minuteries sont d'abord arrêtées dans le thread en cours et redémarrées (avec le même intervalle) dans le thread targetThread. Par conséquent, le fait de déplacer constamment un objet entre les threads peut retarder indéfiniment les événements de minuterie.
Un événement QEvent::ThreadChange est envoyé à cet objet juste avant que l'affinité des threads ne soit modifiée. Vous pouvez gérer cet événement pour effectuer un traitement spécial. Notez que tout nouvel événement envoyé à cet objet sera traité dans le thread targetThread, à condition qu'il ne s'agisse pas de nullptr: lorsqu'il s'agit de nullptr, aucun traitement d'événement pour cet objet ou ses enfants ne peut avoir lieu, car ils ne sont plus associés à aucun thread.
Attention : Cette fonction n' est pas sûre pour les threads ; le thread courant doit être identique à l'affinité du thread courant. En d'autres termes, cette fonction ne peut que "pousser" un objet du thread courant vers un autre thread, elle ne peut pas "tirer" un objet d'un thread arbitraire vers le thread courant. Il existe cependant une exception à cette règle : les objets sans affinité de thread peuvent être "tirés" vers le thread courant.
Dans les versions de Qt antérieures à la 6.7, cette fonction n'avait pas de valeur de retour (void).
Voir également thread().
[private signal] void QObject::objectNameChanged(const QString &objectName)
Ce signal est émis lorsque le nom de l'objet a été modifié. Le nouveau nom de l'objet est transmis en tant que objectName.
Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux mais ne peut pas être émis par l'utilisateur.
Note : Signal de notification pour la propriété objectName.
Voir aussi QObject::objectName.
QObject *QObject::parent() const
Renvoie un pointeur sur l'objet parent.
Voir aussi setParent() et children().
QVariant QObject::property(const char *name) const
Renvoie la valeur de la propriété name de l'objet.
Si cette propriété n'existe pas, la variante renvoyée n'est pas valide.
Les informations sur toutes les propriétés disponibles sont fournies par les méthodes metaObject() et dynamicPropertyNames().
Voir aussi setProperty(), QVariant::isValid(), metaObject() et dynamicPropertyNames().
[protected] int QObject::receivers(const char *signal) const
Renvoie le nombre de récepteurs connectés à signal.
Étant donné que les emplacements et les signaux peuvent être utilisés comme récepteurs de signaux et que les mêmes connexions peuvent être établies plusieurs fois, le nombre de récepteurs est le même que le nombre de connexions établies à partir de ce signal.
Lorsque vous appelez cette fonction, vous pouvez utiliser la macro SIGNAL() pour transmettre un signal spécifique :
if (receivers(SIGNAL(valueChanged(QByteArray))) > 0) { QByteArray data; get_the_value(&data); // expensive operation emit valueChanged(data); }
Comme l'illustre l'extrait de code ci-dessus, vous pouvez utiliser cette fonction pour éviter des opérations coûteuses ou l'émission d'un signal que personne n'écoute.
Attention : Dans une application multithread, les appels consécutifs à cette fonction ne sont pas garantis de produire les mêmes résultats.
Attention : Cette fonction viole le principe de modularité orienté objet. En particulier, cette fonction ne doit pas être appelée à partir d'une surcharge de connectNotify() ou disconnectNotify(), car celles-ci pourraient être appelées à partir de n'importe quel thread.
Voir aussi isSignalConnected().
void QObject::removeEventFilter(QObject *obj)
Supprime un objet de filtre d'événement obj de cet objet. La demande est ignorée si un tel filtre d'événement n'a pas été installé.
Tous les filtres d'événements pour cet objet sont automatiquement supprimés lorsque cet objet est détruit.
Il est toujours prudent de supprimer un filtre d'événement, même pendant l'activation du filtre d'événement (c'est-à-dire à partir de la fonction eventFilter()).
Voir également installEventFilter(), eventFilter() et event().
[protected] QObject *QObject::sender() const
Renvoie un pointeur sur l'objet qui a envoyé le signal, s'il est appelé dans un slot activé par un signal ; sinon, il renvoie nullptr. Le pointeur n'est valide que pendant l'exécution du slot qui appelle cette fonction à partir du contexte thread de cet objet.
Le pointeur renvoyé par cette fonction devient invalide si l'émetteur est détruit ou si le slot est déconnecté du signal de l'émetteur.
Attention : Cette fonction viole le principe de modularité orienté objet. Cependant, l'accès à l'émetteur peut être utile lorsque de nombreux signaux sont connectés à un seul slot.
Attention : Comme mentionné ci-dessus, la valeur de retour de cette fonction n'est pas valide lorsque le slot est appelé via Qt::DirectConnection à partir d'un thread différent de celui de cet objet. N'utilisez pas cette fonction dans ce type de scénario.
Voir aussi senderSignalIndex().
[protected] int QObject::senderSignalIndex() const
Renvoie l'index de la méta-méthode du signal qui a appelé le slot en cours d'exécution, qui est un membre de la classe renvoyée par sender(). Si elle est appelée en dehors d'un slot activé par un signal, elle renvoie -1.
Pour les signaux avec des paramètres par défaut, cette fonction renvoie toujours l'index avec tous les paramètres, quel que soit celui qui a été utilisé avec connect(). Par exemple, le signal destroyed(QObject *obj = \nullptr) aura deux index différents (avec et sans le paramètre), mais cette fonction renverra toujours l'index avec un paramètre. Cela ne s'applique pas à la surcharge des signaux avec différents paramètres.
Attention : Cette fonction viole le principe de modularité orienté objet. Cependant, l'accès à l'index du signal peut être utile lorsque de nombreux signaux sont connectés à un seul slot.
Avertissement : La valeur de retour de cette fonction n'est pas valide lorsque le slot est appelé via Qt::DirectConnection à partir d'un thread différent de celui de cet objet. N'utilisez pas cette fonction dans ce type de scénario.
Voir aussi sender(), QMetaObject::indexOfSignal() et QMetaObject::method().
void QObject::setObjectName(const QString &name)
Fixe le nom de l'objet à name.
Remarque : fonction de définition de la propriété objectName.
Voir également objectName().
[since 6.4] void QObject::setObjectName(QAnyStringView name)
Note : Fonction de définition de la propriété objectName.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.4.
void QObject::setParent(QObject *parent)
Fait de l'objet un enfant de parent.
Voir aussi parent() et children().
bool QObject::setProperty(const char *name, const QVariant &value)
Fixe la valeur de la propriété name de l'objet à value.
Si la propriété est définie dans la classe à l'aide de Q_PROPERTY, true est renvoyé en cas de succès et false dans le cas contraire. Si la propriété n'est pas définie à l'aide de Q_PROPERTY et n'est donc pas répertoriée dans le méta-objet, elle est ajoutée en tant que propriété dynamique et false est renvoyé.
Les informations sur toutes les propriétés disponibles sont fournies par les pages metaObject() et dynamicPropertyNames().
Les propriétés dynamiques peuvent être interrogées à nouveau à l'aide de property() et peuvent être supprimées en fixant la valeur de la propriété à une valeur non valide QVariant. La modification de la valeur d'une propriété dynamique entraîne l'envoi d'un message QDynamicPropertyChangeEvent à l'objet.
Remarque : les propriétés dynamiques commençant par "_q_" sont réservées à des fins internes.
Voir également property(), metaObject(), dynamicPropertyNames() et QMetaProperty::write().
[since 6.6] bool QObject::setProperty(const char *name, QVariant &&value)
Cette fonction surcharge QObject::setProperty.
Cette fonction a été introduite dans Qt 6.6.
[noexcept] bool QObject::signalsBlocked() const
Renvoie true si les signaux sont bloqués ; sinon, renvoie false.
Les signaux ne sont pas bloqués par défaut.
Voir aussi blockSignals() et QSignalBlocker.
int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
Il s'agit d'une fonction surchargée qui démarre un timer de type timerType et un timeout de interval millisecondes. Cela équivaut à appeler :
startTimer(std::chrono::milliseconds{interval}, timerType);
À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement d'exécution et la réinitialisation de la valeur à 1ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant le timer s'il était en cours d'exécution ou en ne le démarrant pas du tout).
Voir aussi timerEvent(), killTimer(), QChronoTimer, et QBasicTimer.
int QObject::startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer)
Démarre un timer et renvoie un identifiant de timer, ou renvoie zéro s'il n'a pas pu démarrer de timer.
Un événement de minuterie se produit tous les interval jusqu'à ce que killTimer() soit appelé. Si interval est égal à std::chrono::duration::zero(), l'événement de la minuterie se produit une fois chaque fois que le contrôle revient à la boucle d'événements, c'est-à-dire qu'il n'y a plus d'événements du système de fenêtres natif à traiter.
À partir de Qt 6.10, la définition d'un intervalle négatif entraînera un avertissement d'exécution et la réinitialisation de la valeur à 1ms. Avant Qt 6.10, une minuterie Qt vous permettait de définir un intervalle négatif mais se comportait de manière surprenante (par exemple en arrêtant la minuterie si elle était en cours d'exécution ou en ne la démarrant pas du tout).
La fonction virtuelle timerEvent() est appelée avec la classe de paramètres d'événement QTimerEvent lorsqu'un événement de minuterie se produit. Réimplémentez cette fonction pour obtenir des événements de minuterie.
Si plusieurs minuteries sont en cours d'exécution, la méthode QTimerEvent::id() peut être utilisée pour savoir quelle minuterie a été activée.
Exemple :
class MyObject : public QObject { Q_OBJECTpublic: MyObject(QObject *parent = nullptr) ; Q_SIGNALS : void valueChanged() ;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 *événement){ qDebug() << "Timer ID:" << event->id(); }
Notez que la précision de la minuterie dépend du système d'exploitation et du matériel sous-jacents.
L'argument timerType vous permet de personnaliser la précision de la minuterie. Voir Qt::TimerType pour plus d'informations sur les différents types de minuterie. La plupart des plateformes supportent une précision de 20 millisecondes ; certaines offrent plus. Si Qt n'est pas en mesure de fournir le nombre requis d'événements de temporisation, il en rejettera certains silencieusement.
Les classes QTimer et QChronoTimer fournissent une interface de programmation de haut niveau avec des minuteries à coup unique et des signaux de minuterie au lieu d'événements. Il existe également une classe QBasicTimer qui est plus légère que QChronoTimer mais moins maladroite que l'utilisation directe des ID de minuterie.
Remarque : à partir de Qt 6.8, le type de interval est std::chrono::nanoseconds, avant cela, c'était std::chrono::milliseconds. Ce changement est rétrocompatible avec les anciennes versions de Qt.
Remarque : dans Qt 6.8, QObject a été remplacé par Qt::TimerId pour représenter les identifiants de minuterie. Cette méthode convertit TimerId en int pour des raisons de compatibilité ascendante, mais vous pouvez utiliser Qt::TimerId pour vérifier la valeur renvoyée par cette méthode, par exemple :
QObject *obj; //... const auto id = Qt::TimerId {obj->startTimer(100ms)}; if (id != Qt::TimerId::Invalid) { // The timer has been started successfully }
Il s'agit d'une fonction surchargée.
Voir aussi timerEvent(), killTimer(), QChronoTimer, et QBasicTimer.
QThread *QObject::thread() const
Renvoie le thread dans lequel vit l'objet.
Voir aussi moveToThread().
[virtual protected] void QObject::timerEvent(QTimerEvent *event)
Ce gestionnaire d'événements peut être réimplémenté dans une sous-classe pour recevoir les événements de la minuterie pour l'objet.
QChronoTimer fournit des interfaces de plus haut niveau pour la fonctionnalité de la minuterie, ainsi que des informations plus générales sur les minuteries. L'événement de la minuterie est transmis dans le paramètre event.
Voir également startTimer(), killTimer() et event().
[static] QString QObject::tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)
Renvoie une version traduite de sourceText, éventuellement basée sur une chaîne disambiguation et une valeur de n pour les chaînes contenant des pluriels ; sinon, renvoie QString::fromUtf8(sourceText) si aucune chaîne traduite appropriée n'est disponible.
Exemple :
void SpreadSheet::setupMenuBar() { QMenu *fileMenu = menuBar()->addMenu(tr("&File")); ...
Si le même sourceText est utilisé dans différents rôles au sein du même contexte, une chaîne d'identification supplémentaire peut être transmise dans disambiguation (nullptr par défaut).
Exemple :
MyWindow::MyWindow() { QLabel *senderLabel = new QLabel(tr("Name:")); QLabel *recipientLabel = new QLabel(tr("Name:", "recipient")); ...
Voir Writing Source Code for Translation pour une description détaillée des mécanismes de traduction de Qt en général, et la section Disambiguate Identical Text pour des informations sur la désambiguïsation.
Attention : Cette méthode n'est réentrante que si tous les traducteurs sont installés avant d' appeler cette méthode. Il n'est pas possible d'installer ou de supprimer des traducteurs pendant que l'on effectue des traductions. Cela entraînera probablement des plantages ou d'autres comportements indésirables.
Voir également QCoreApplication::translate() et Internationalisation avec Qt.
Documentation des variables membres
const QMetaObject QObject::staticMetaObject
Cette variable stocke le méta-objet de la classe.
Un méta-objet contient des informations sur une classe qui hérite de QObject, par exemple le nom de la classe, le nom de la superclasse, les propriétés, les signaux et les emplacements. Toute classe contenant la macro Q_OBJECT possède également un méta-objet.
Les informations relatives au méta-objet sont nécessaires au mécanisme de connexion des signaux/emplacements et au système de propriétés. La fonction inherits() utilise également le méta-objet.
Si vous avez un pointeur sur un objet, vous pouvez utiliser metaObject() pour récupérer le méta-objet associé à cet objet.
Exemple :
QPushButton::staticMetaObject.className(); // returns "QPushButton" QObject *obj = new QPushButton; obj->metaObject()->className(); // returns "QPushButton"
Voir également metaObject().
Non-membres apparentés
QObjectList
[since 6.8] enum class TimerId
Il est utilisé pour représenter les identifiants de minuterie (par exemple, QTimer et QChronoTimer). Le type sous-jacent est int. Vous pouvez utiliser qToUnderlying() pour convertir Qt::TimerId en int.
| Constante | Valeur | Description |
|---|---|---|
QObject::TimerId::Invalid | 0 | Représente l'ID d'une minuterie non active ; son utilisation dépend du contexte, par exemple, c'est la valeur renvoyée par QObject::startTimer() pour indiquer qu'il n'a pas réussi à démarrer une minuterie ; tandis que QChronoTimer::id() renvoie cette valeur lorsque la minuterie est inactive, c'est-à-dire que timer.isActive() renvoie false. |
Cette liste a été introduite dans Qt 6.8.
Voir également QTimer::id(), QChronoTimer::id() et QObject::startTimer().
template <typename T> T qobject_cast(QObject *object)
template <typename T> T qobject_cast(const QObject *object)
Renvoie le cast object donné vers le type T si l'objet est de type T (ou d'une sous-classe) ; sinon, renvoie nullptr. Si object est nullptr, il renvoie également nullptr.
La classe T doit hériter (directement ou indirectement) de QObject et être déclarée avec la macro Q_OBJECT.
On considère qu'une classe hérite d'elle-même.
Exemple :
QObject *obj = new QTimer; // QTimer inherits QObject QTimer *timer = qobject_cast<QTimer *>(obj); // timer == (QObject *)obj QAbstractButton *button = qobject_cast<QAbstractButton *>(obj); // button == nullptr
La fonction qobject_cast() se comporte de manière similaire à la fonction C++ standard dynamic_cast(), avec l'avantage de ne pas nécessiter de support RTTI et de fonctionner à travers les limites des bibliothèques dynamiques.
qobject_castLa fonction () peut également être utilisée avec les interfaces.
Attention : Si T n'est pas déclaré avec la macro Q_OBJECT, la valeur de retour de cette fonction est indéfinie.
Voir aussi QObject::inherits().
Documentation sur les macros
[since 6.7] QT_NO_CONTEXTLESS_CONNECT
La définition de cette macro désactive la surcharge de QObject::connect() qui connecte un signal à un foncteur, sans spécifier également un QObject comme objet récepteur/contexte (c'est-à-dire la surcharge à 3 arguments de QObject::connect()).
L'utilisation de la surcharge sans contexte est source d'erreurs, car il est facile de se connecter à des foncteurs qui dépendent d'un état local de l'extrémité réceptrice. Si cet état local est détruit, la connexion n'est pas automatiquement déconnectée.
De plus, ces connexions sont toujours des connexions directes, ce qui peut poser des problèmes dans les scénarios multithreads (par exemple, si le signal est émis par un autre thread).
Cette macro a été introduite dans Qt 6.7.
Voir aussi QObject::connect et Qt::ConnectionType.
QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
La définition de cette macro désactive le rétrécissement et les conversions de la virgule flottante à l'intégrale entre les arguments portés par un signal et les arguments acceptés par un slot, lorsque le signal et le slot sont connectés à l'aide de la syntaxe basée sur le PMF.
Voir aussi QObject::connect.
Q_CLASSINFO(Name, Value)
Cette macro associe des informations supplémentaires à la classe, qui sont disponibles à l'aide de QObject::metaObject(). Les informations supplémentaires prennent la forme d'une chaîne Name et d'une chaîne littérale Value.
Exemple :
class MyClass : public QObject { Q_OBJECT Q_CLASSINFO("Author", "Pierre Gendron") Q_CLASSINFO("URL", "http://www.my-organization.qc.ca") public: //... };
Qt utilise la macro dans Qt D-Bus et Qt Qml dans les modules. Par exemple, lorsque vous définissez des types d'objets QML en C++, vous pouvez désigner une propriété comme étant la propriété par défaut:
Q_CLASSINFO("DefaultProperty", "content")
Voir également QMetaObject::classInfo(), Utiliser les adaptateurs Qt D-Bus et Définir les types QML à partir de C++.
Q_EMIT
Utilisez cette macro pour remplacer le mot-clé emit pour l'émission de signaux, lorsque vous souhaitez utiliser Qt Signals and Slots avec un mécanisme de signaux/slot tiers.
La macro est normalement utilisée lorsque no_keywords est spécifié avec la variable CONFIG dans le fichier .pro, mais elle peut être utilisée même lorsque no_keywords n' est pas spécifié.
Q_ENUM(...)
Cette macro enregistre un type d'enum avec le système de méta-objets. Elle doit être placée après la déclaration de l'enum dans une classe qui possède la macro Q_OBJECT, Q_GADGET ou Q_GADGET_EXPORT. Pour les espaces de noms, utilisez plutôt Q_ENUM_NS().
Par exemple :
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; };
Les énumérations déclarées avec Q_ENUM ont leur QMetaEnum enregistré dans l'espace de nommage QMetaObject. Vous pouvez également utiliser QMetaEnum::fromType() pour obtenir QMetaEnum.
Les énumérations enregistrées sont automatiquement enregistrées dans le méta-système de types de Qt, ce qui les rend connues de QMetaType sans qu'il soit nécessaire d'utiliser Q_DECLARE_METATYPE(). Cela permet des fonctionnalités utiles ; par exemple, si elles sont utilisées dans un QVariant, vous pouvez les convertir en chaînes de caractères. De même, si vous les passez à QDebug, leurs noms seront affichés.
N'oubliez pas que les valeurs des énumérations sont stockées sous la forme de int signés dans le système d'objets méta. L'enregistrement d'énumérations avec des valeurs en dehors de la plage des valeurs valides pour int entraînera des débordements et un comportement potentiellement indéfini lors de l'accès à ces énumérations par le biais du système de métaobjets. QML, par exemple, accède aux énumérations enregistrées par l'intermédiaire du système de métaobjets.
Voir également le système de propriétés de Qt.
Q_ENUM_NS(...)
Cette macro enregistre un type enum avec le système de méta-objets. Elle doit être placée après la déclaration de l'enum dans un espace de noms qui possède la macro Q_NAMESPACE. C'est la même chose que Q_ENUM mais dans un espace de noms.
Les énumérations déclarées avec Q_ENUM_NS ont leur QMetaEnum enregistré dans l'espace de noms qui les entoure QMetaObject. Vous pouvez également utiliser QMetaEnum::fromType() pour obtenir QMetaEnum.
Les énumérations enregistrées sont automatiquement enregistrées dans le méta-système de types de Qt, ce qui les rend connues de QMetaType sans qu'il soit nécessaire d'utiliser Q_DECLARE_METATYPE(). Cela permet des fonctionnalités utiles ; par exemple, si elles sont utilisées dans un QVariant, vous pouvez les convertir en chaînes de caractères. De même, si vous les passez à QDebug, leurs noms seront affichés.
N'oubliez pas que les valeurs des énumérations sont stockées sous la forme de int signés dans le système d'objets méta. L'enregistrement d'énumérations avec des valeurs en dehors de la plage des valeurs valides pour int entraînera des débordements et un comportement potentiellement indéfini lors de l'accès à ces énumérations par le biais du système de métaobjets. QML, par exemple, accède aux énumérations enregistrées par l'intermédiaire du système de métaobjets.
Voir également le système de propriétés de Qt.
Q_FLAG(...)
Cette macro enregistre une seule flags type avec le système de méta-objets. Elle est généralement utilisée dans une définition de classe pour déclarer que les valeurs d'une énumération donnée peuvent être utilisées comme drapeaux et combinées à l'aide de l'opérateur bitwise OR. Pour les espaces de noms, utilisez plutôt Q_FLAG_NS().
La macro doit être placée après la déclaration de l'énumération. La déclaration du type de drapeau se fait à l'aide de la macro Q_DECLARE_FLAGS().
Par exemple, dans QItemSelectionModel, l'indicateur SelectionFlags est déclaré de la manière suivante :
class Q_CORE_EXPORT QItemSelectionModel : public QObject { Q_OBJECT ... public: enum SelectionFlag { NoUpdate = 0x0000, Clear = 0x0001, Select = 0x0002, Deselect = 0x0004, Toggle = 0x0008, Current = 0x0010, Rows = 0x0020, Columns = 0x0040, SelectCurrent = Select | Current, ToggleCurrent = Toggle | Current, ClearAndSelect = Clear | Select }; Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag) Q_FLAG(SelectionFlags) };
Note : La macro Q_FLAG se charge d'enregistrer les valeurs individuelles des drapeaux avec le système de méta-objets, il n'est donc pas nécessaire d'utiliser Q_ENUM() en plus de cette macro.
Voir aussi le système de propriété de Qt.
Q_FLAG_NS(...)
Cette macro enregistre une seule flags type avec le système de méta-objets. Elle est utilisée dans un espace de noms qui possède la macro Q_NAMESPACE, pour déclarer que les valeurs d'une énumération donnée peuvent être utilisées comme drapeaux et combinées à l'aide de l'opérateur bitwise OR. C'est la même chose que Q_FLAG mais dans un espace de noms.
La macro doit être placée après la déclaration de l'énumération.
Note : La macro Q_FLAG_NS se charge d'enregistrer les valeurs individuelles des drapeaux avec le système de méta-objets, il n'est donc pas nécessaire d'utiliser Q_ENUM_NS() en plus de cette macro.
Voir aussi le système de propriété de Qt.
Q_GADGET
La macro Q_GADGET est une version allégée de la macro Q_OBJECT pour les classes qui n'héritent pas de QObject mais qui veulent quand même utiliser certaines des capacités de réflexion offertes par QMetaObject.
Remarque : l'expansion de cette macro se termine par un spécificateur d'accès private:. Si vous déclarez des membres immédiatement après cette macro, ces membres seront également privés. Pour ajouter des membres publics (ou protégés) juste après la macro, utilisez un spécificateur d'accès public: (ou protected:).
Les Q_GADGET peuvent avoir Q_ENUM, Q_PROPERTY et Q_INVOKABLE, mais ils ne peuvent pas avoir de signaux ou de slots.
Q_GADGET met à disposition un membre de classe, staticMetaObject. staticMetaObject est de type QMetaObject et donne accès aux enums déclarés avec Q_ENUM.
Voir également Q_GADGET_EXPORT.
[since 6.3] Q_GADGET_EXPORT(EXPORT_MACRO)
La macro Q_GADGET_EXPORT fonctionne exactement comme la macro Q_GADGET. Cependant, la variable staticMetaObject qui est mise à disposition (voir Q_GADGET) est déclarée avec le qualificatif EXPORT_MACRO fourni. Cela est utile si l'objet doit être exporté à partir d'une bibliothèque dynamique, mais que la classe qui le contient ne doit pas l'être dans son ensemble (par exemple, parce qu'elle se compose principalement de fonctions en ligne).
Remarque : cette macro-expansion se termine par un spécificateur d'accès private:. Si vous déclarez des membres immédiatement après cette macro, ces membres seront également privés. Pour ajouter des membres publics (ou protégés) juste après la macro, utilisez un spécificateur d'accès public: (ou protected:).
Par exemple, cette macro a été introduite dans Qt 6 :
class Point { Q_GADGET_EXPORT(EXPORT_MACRO) Q_PROPERTY(int x MEMBER x) Q_PROPERTY(int y MEMBER y) ~~~
Cette macro a été introduite dans Qt 6.3.
Voir aussi Q_GADGET et Créer des bibliothèques partagées.
Q_INTERFACES(...)
Cette macro indique à Qt les interfaces que la classe met en œuvre. Elle est utilisée lors de l'implémentation de plugins.
Voir aussi Q_DECLARE_INTERFACE(), Q_PLUGIN_METADATA(), et Comment créer des plugins Qt.
Q_INVOKABLE
Appliquer cette macro aux déclarations de fonctions membres pour permettre leur invocation via le système des méta-objets. La macro est écrite avant le type de retour, comme le montre l'exemple suivant :
class Window : public QWidget { Q_OBJECT public: Window(); void normalMethod(); Q_INVOKABLE void invokableMethod(); };
La fonction invokableMethod() est marquée à l'aide de Q_INVOKABLE, ce qui entraîne son enregistrement dans le système des méta-objets et permet de l'invoquer à l'aide de QMetaObject::invokeMethod(). La fonction normalMethod() n'étant pas enregistrée de cette manière, elle ne peut pas être invoquée à l'aide de QMetaObject::invokeMethod().
Si une fonction membre invocable renvoie un pointeur vers un QObject ou une sous-classe de QObject et qu'elle est invoquée à partir de QML, des règles de propriété spéciales s'appliquent. Voir Conversion des types de données entre QML et C++ pour plus d'informations.
[since 6.0] Q_MOC_INCLUDE
La macro Q_MOC_INCLUDE peut être utilisée à l'intérieur ou à l'extérieur d'une classe, et indiquer au Meta-Object Compiler d'ajouter un include.
// Put this in your code and the generated code will include this header. Q_MOC_INCLUDE("myheader.h")
Elle est utile si les types que vous utilisez comme propriétés ou comme arguments de signaux ou de slots sont déclarés à l'avance.
Cette macro a été introduite dans Qt 6.0.
Q_NAMESPACE
La macro Q_NAMESPACE peut être utilisée pour ajouter des capacités QMetaObject à un espace de noms.
Les Q_NAMESPACEs peuvent avoir Q_CLASSINFO, Q_ENUM_NS, Q_FLAG_NS, mais ils ne peuvent pas avoir Q_ENUM, Q_FLAG, Q_PROPERTY, Q_INVOKABLE, des signaux ou des slots.
Q_NAMESPACE met à disposition une variable externe, staticMetaObject. staticMetaObject est de type QMetaObject et permet d'accéder aux enums déclarés avec Q_ENUM_NS/Q_FLAG_NS.
Par exemple :
namespace test { Q_NAMESPACE ...
Voir aussi Q_NAMESPACE_EXPORT.
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
La macro Q_NAMESPACE_EXPORT peut être utilisée pour ajouter des fonctionnalités QMetaObject à un espace de noms.
Elle fonctionne exactement comme la macro Q_NAMESPACE. Toutefois, la variable externe staticMetaObject définie dans l'espace de noms est déclarée avec le qualificatif EXPORT_MACRO fourni. Ceci est utile si l'objet doit être exporté à partir d'une bibliothèque dynamique.
C'est utile si l'objet doit être exporté à partir d'une bibliothèque dynamique, par exemple :
namespace test { Q_NAMESPACE_EXPORT(EXPORT_MACRO) ...
Voir aussi Q_NAMESPACE et Création de bibliothèques partagées.
Q_OBJECT
La macro Q_OBJECT est utilisée pour activer les fonctionnalités des méta-objets, telles que les propriétés dynamiques, les signaux et les slots.
Vous pouvez ajouter la macro Q_OBJECT à n'importe quelle section d'une définition de classe qui déclare ses propres signaux et slots ou qui utilise d'autres services fournis par le système de méta-objets de Qt.
Remarque : l'expansion de cette macro se termine par un spécificateur d'accès private:. Si vous déclarez des membres immédiatement après cette macro, ces membres seront également privés. Pour ajouter des membres publics (ou protégés) juste après la macro, utilisez un spécificateur d'accès public: (ou protected:).
Exemple :
#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; };
Remarque : cette macro exige que la classe soit une sous-classe de QObject. Utilisez Q_GADGET ou Q_GADGET_EXPORT au lieu de Q_OBJECT pour activer la prise en charge des enums par le système de méta-objets dans une classe qui n'est pas une sous-classe de QObject.
Voir aussi Système de Méta-Objets, Signaux et Slots, et Système de Propriétés de Qt.
Q_PROPERTY(...)
Cette macro est utilisée pour déclarer des propriétés dans les classes qui héritent de QObject. Les propriétés se comportent comme les membres de données de la classe, mais elles disposent de fonctionnalités supplémentaires accessibles par le biais du système de méta-objets.
Q_PROPERTY(type name
(READ getFunction [WRITE setFunction] |
MEMBER memberName [(READ getFunction | WRITE setFunction)])
[RESET resetFunction]
[NOTIFY notifySignal]
[REVISION int | REVISION(int[, int])]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[BINDABLE bindableProperty]
[CONSTANT]
[FINAL]
[VIRTUAL]
[OVERRIDE]
[REQUIRED])Le nom et le type de la propriété ainsi que la fonction READ sont nécessaires. Le type peut être n'importe quel type pris en charge par QVariant, ou un type défini par l'utilisateur. Les autres éléments sont facultatifs, mais la fonction WRITE est courante. Les attributs prennent la valeur "true" par défaut, à l'exception de USER, qui prend la valeur "false" par défaut.
Par exemple :
Q_PROPERTY(QString title READ title WRITE setTitle USER true)
Pour plus de détails sur l'utilisation de cette macro et un exemple plus détaillé de son utilisation, voir la discussion sur le système de propriétés de Qt.
Voir aussi le système de propriétés de Qt.
Q_REVISION
Appliquer cette macro aux déclarations de fonctions membres pour leur attribuer un numéro de révision dans le système de méta-objets. La macro est écrite avant le type de retour, comme le montre l'exemple suivant :
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(); };
Ceci est utile lorsque vous utilisez le système de méta-objets pour exposer dynamiquement des objets à une autre API, car vous pouvez faire correspondre la version attendue à plusieurs versions de l'autre API. Prenons l'exemple simplifié suivant :
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));En utilisant la même classe Window que dans l'exemple précédent, les propriétés newProperty et newMethod ne seraient exposées dans ce code que si la version attendue est 2.1 ou supérieure.
Étant donné que toutes les méthodes sont considérées comme faisant partie de la révision 0 si elles ne sont pas étiquetées, une étiquette de Q_REVISION(0) ou Q_REVISION(0, 0) n'est pas valable et est ignorée.
Vous pouvez passer un ou deux paramètres entiers à Q_REVISION. Si vous passez un seul paramètre, il indique uniquement la version mineure. Cela signifie que la version majeure n'est pas spécifiée. Si vous en passez deux, le premier paramètre est la version majeure et le second la version mineure.
Cette balise n'est pas utilisée par le système de méta-objets lui-même. Actuellement, elle n'est utilisée que par le module QtQml.
Pour une balise de chaîne plus générique, voir QMetaMethod::tag()
Voir aussi QMetaMethod::revision().
Q_SET_OBJECT_NAME(Object)
Cette macro attribue à Object l'objet objectName.
Il importe peu que Object soit un pointeur ou non, la macro s'en charge elle-même.
Voir aussi QObject::objectName().
Q_SIGNAL
Il s'agit d'une macro supplémentaire qui vous permet de marquer une seule fonction en tant que signal. Elle peut être très utile, en particulier lorsque vous utilisez un analyseur de code source tiers qui ne comprend pas les groupes signals ou Q_SIGNALS.
Utilisez cette macro pour remplacer le mot-clé signals dans les déclarations de classe, lorsque vous souhaitez utiliser les signaux et les slots de Qt XML avec un mécanisme de signal/slot tiers.
La macro est normalement utilisée lorsque no_keywords est spécifié avec la variable CONFIG dans le fichier .pro, mais elle peut être utilisée même lorsque no_keywords n' est pas spécifié.
Q_SIGNALS
Utilisez cette macro pour remplacer le mot-clé signals dans les déclarations de classe, lorsque vous souhaitez utiliser les signaux et les slots de Qt avec un mécanisme de signal/slot tiers.
La macro est normalement utilisée lorsque no_keywords est spécifié avec la variable CONFIG dans le fichier .pro, mais elle peut être utilisée même lorsque no_keywords n' est pas spécifié.
Q_SLOT
Il s'agit d'une macro supplémentaire qui vous permet de marquer une fonction unique en tant que slot. Elle peut être très utile, en particulier lorsque vous utilisez un analyseur de code source tiers qui ne comprend pas les groupes slots ou Q_SLOTS.
Utilisez cette macro pour remplacer le mot-clé slots dans les déclarations de classe, lorsque vous souhaitez utiliser les signaux et les slots de Qt XML avec un mécanisme de signal/slot tiers.
La macro est normalement utilisée lorsque no_keywords est spécifié avec la variable CONFIG dans le fichier .pro, mais elle peut être utilisée même lorsque no_keywords n' est pas spécifié.
Q_SLOTS
Utilisez cette macro pour remplacer le mot-clé slots dans les déclarations de classe, lorsque vous souhaitez utiliser les signaux et les slots de Qt avec un mécanisme de signal/slot tiers.
La macro est normalement utilisée lorsque no_keywords est spécifié avec la variable CONFIG dans le fichier .pro, mais elle peut être utilisée même lorsque no_keywords n' est pas spécifié.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.