QObject Class
La classe QObject est la classe de base de tous les objets Qt. En savoir plus...
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 *émetteur, PointerToMemberFunction signal, const QObject *contexte, Functor functor, Qt::ConnectionType type)
- disconnect(const QObject *émetteur, const char *signal, const QObject *récepteur, const char *méthode)
- disconnect(const char *signal, const QObject *récepteur, const char *méthode) const
- disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
- 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) |
(since 6.12) bool | disconnect(QMetaObject::Connection &connection) |
(since 6.12) bool | disconnect(QMetaObject::Connection &&connection) |
| bool | disconnect(const QMetaObject::Connection &connection) |
| bool | disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method) |
| bool | disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method) |
| bool | disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method) |
| const QMetaObject | staticMetaObject |
| QString | tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1) |
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) |
Personnes concernées non adhérentes
| 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 |
(since 6.12) | QT_NO_DISCONNECT_CONST_CONNECTION |
| QT_NO_NARROWING_CONVERSIONS_IN_CONNECT | |
| Q_CLASSINFO(Name, Value) | |
| Q_EMIT | |
| Q_ENUM(...) | |
| Q_ENUM_NS(...) | |
| Q_FLAG(...) | |
| Q_FLAG_NS(...) | |
| Q_GADGET | |
(since 6.3) | Q_GADGET_EXPORT(EXPORT_MACRO) |
| Q_INTERFACES(...) | |
| Q_INVOKABLE | |
(since 6.0) | Q_MOC_INCLUDE |
| Q_NAMESPACE | |
| Q_NAMESPACE_EXPORT(EXPORT_MACRO) | |
| Q_OBJECT | |
| Q_PROPERTY(...) | |
| Q_REVISION | |
| Q_SET_OBJECT_NAME(Object) | |
| Q_SIGNAL | |
| Q_SIGNALS | |
| Q_SLOT | |
| Q_SLOTS |
Description détaillée
QObject est au cœur du modèle d'objets Qt. La caractéristique centrale de ce modèle est un mécanisme très puissant permettant une communication fluide entre les objets, appelé « signaux et slots ». Vous pouvez connecter un signal à un slot à l'aide de ` connect()` et rompre la connexion avec ` disconnect()`. Pour éviter les boucles de notification sans fin, vous pouvez bloquer temporairement les signaux à l'aide de ` blockSignals()`. Les fonctions protégées ` connectNotify()` et ` disconnectNotify()` permettent de suivre les connexions.
Les QObjects s’organisent en arborescences d’objets. Lorsque vous créez un QObject dont un autre objet est le parent, cet objet s’ajoute automatiquement à la liste children() de son parent. Le parent prend possession de l’objet ; c’est-à-dire qu’il supprimera automatiquement ses enfants dans son destructeur. Vous pouvez rechercher un objet par son nom et, éventuellement, par son type à l’aide de ` findChild()` ou ` findChildren()`.
Chaque objet dispose d’une méthode ` objectName()` et son nom de classe peut être obtenu via la méthode correspondante ` metaObject()` (voir ` QMetaObject::className()`). Vous pouvez déterminer si la classe de l’objet hérite d’une autre classe dans la hiérarchie d’héritage de `QObject` à l’aide de la fonction ` inherits()`.
Lorsqu’un objet est supprimé, il émet un signal ` destroyed()`. Vous pouvez intercepter ce signal pour éviter les références pendantes vers des `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 pratique, childEvent(), peut être réimplémenté pour intercepter les événements des enfants.
Enfin, QObject fournit la prise en charge de base des minuteries dans Qt ; voir QChronoTimer pour une prise en charge de haut niveau des minuteries.
Notez que la macro Q_OBJECT est obligatoire pour tout objet implémentant 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 le non-respect de cette consigne peut entraîner un comportement inhabituel de certaines fonctions.
QWidget Tous les widgets Qt héritent de QObject. La fonction de commodité ` isWidgetType()` indique si un objet est effectivement un widget. Elle est bien plus rapide que ` qobject_cast<XML-ph-0002@deepl.internal*>(obj)` ou ` obj->inherits("QWidget")`.
Certaines fonctions de QObject, par exemple children(), renvoient un QObjectList. QObjectList est un typedef pour QList<QObject *>.
Affinité de thread
On dit qu’une instance de QObject possède une affinité de thread, ou qu’elle réside 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écutera dans le thread où réside l’objet.
Remarque : si un QObject n'a pas d'affinité de thread (c'est-à-dire si la fonction ` thread()` renvoie zéro), ou s'il réside dans un thread ne disposant pas de boucle d'événements en cours d'exécution, il ne peut alors pas recevoir de signaux mis en file d'attente ni d'événements postés.
Par défaut, un QObject réside dans le thread dans lequel il a été créé. L'affinité de thread d'un objet peut être interrogée à l'aide de ` thread()` et modifiée à l'aide de ` moveToThread()`.
Tous les QObjects doivent se trouver dans le même thread que leur parent. Par conséquent :
- setParent() échouera si les deux QObjects concernés résident dans des threads différents.
- Lorsqu’un QObject est déplacé vers un autre thread, tous ses enfants sont automatiquement déplacés également.
- moveToThread() échouera si le QObject possède un parent.
- Si des QObjects sont créés à l’intérieur de ` QThread::run()`, ils ne peuvent pas devenir des enfants de l’objet ` QThread `, car ` QThread ` ne se trouve pas dans le thread qui appelle ` QThread::run()`.
Remarque : les variables membresd’un QObject ne deviennent pas automatiquement ses enfants. La relation parent-enfant doit être établie soit en passant un pointeur vers l’ 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 ne dispose ni de constructeur de copie ni d’opérateur d’affectation. C’est voulu. En réalité, ils sont bien déclarés, mais dans une section « private » à l’aide de la macro Q_DISABLE_COPY(). En effet, toutes les classes Qt dérivées de QObject (directement ou indirectement) utilisent cette macro pour déclarer leur constructeur de copie et leur opérateur d’affectation comme privés. Le raisonnement se trouve dans la discussion sur «Identité vs Valeur» sur la page Modèle d’objet Qt.
La principale conséquence est que vous devez utiliser des pointeurs vers QObject (ou vers votre sous-classe de QObject) là où vous pourriez autrement être tenté d’utiliser votre sous-classe de QObject en tant que 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 de conteneurs. Vous devez stocker des pointeurs.
Connexion automatique
Le système de méta-objets de Qt fournit un mécanisme permettant de connecter automatiquement les signaux et les slots entre les sous-classes de QObject et leurs enfants. À condition que les objets soient définis avec des noms appropriés et que les slots respectent une convention de nommage simple, cette connexion peut être effectuée à l'exécution par la fonction ` QMetaObject::connectSlotsByName()`.
uic génère du code qui appelle cette fonction afin de permettre la connexion automatique entre les widgets des formulaires créés avec le Designer d’Qt Widgets . Vous trouverez plus d’informations sur l’utilisation de la connexion automatique avec le Designer d’Qt Widgets dans la section « Utilisation d’un fichier d’interface utilisateur du Designer d’ Qt Widgets dans votre application » du manuel du Designer d’Qt Widgets .
Propriétés dynamiques
Les propriétés dynamiques peuvent être ajoutées ou supprimées d’instances de `QObject` lors de l’exécution. Elles n’ont pas besoin d’être déclarées lors de la compilation, mais offrent les mêmes avantages que les propriétés statiques et sont manipulées à l’aide de la même API : on utilise ` property()` pour les lire et ` setProperty()` pour les écrire.
Les propriétés dynamiques sont prises en charge par Qt Widgets Designer, et il est possible d'attribuer des propriétés dynamiques aussi bien aux widgets Qt standard qu'aux formulaires créés par l'utilisateur.
Internationalisation (I18n)
Toutes les sous-classes de QObject prennent en charge les fonctionnalités de traduction de Qt, ce qui permet de traduire l'interface utilisateur d'une application dans différentes langues.
Pour qu'un texte visible par l'utilisateur puisse être traduit, il doit être encadré par des appels à la fonction tr(). Cette procédure est expliquée en détail dans le document « Rédaction du code source en vue de 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
Remarque : cette propriété prend en charge les liaisons de type « QProperty ».
Cette propriété contient le nom de cet objet
Vous pouvez rechercher un objet par son nom (et son type) à l'aide de la méthode ` findChild()` (). Vous pouvez rechercher un ensemble d'objets à l'aide de la méthode ` findChildren()` ().
qDebug("MyClass::setPrecision() : (%s) précision non valide %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 de notification :
| 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 des fonctions membres
[explicit invokable] QObject::QObject(QObject *parent = nullptr)
Crée un objet dont l'objet parent est parent.
Le parent d’un objet peut être considéré comme le propriétaire de cet 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.
Définir parent sur nullptr crée un objet sans parent. Si l’objet est un widget, il deviendra une fenêtre de niveau supérieur.
Remarque : cette fonction peut être appelée via le système de méta-objets et depuis QML. Voir Q_INVOKABLE.
Voir également parent(), findChild() et findChildren().
[virtual noexcept] QObject::~QObject()
Détruit l'objet et supprime tous ses objets enfants.
Tous les signaux entrants et sortants de l’objet sont automatiquement déconnectés, et tous les événements en attente pour cet 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 `.
Avertissement : tous les objets enfants sont supprimés. Si l'un de ces objets se trouve sur la pile ou est global, votre programme finira tôt ou tard par planter. Nous vous déconseillons de conserver des pointeurs vers des objets enfants depuis l'extérieur du parent. Si vous le faites malgré tout, le signal ` destroyed()` vous permet de détecter le moment où un objet est détruit.
Avertissement : la suppression d’un ` QObject ` alors qu’il traite un événement qui lui a été transmis peut provoquer un plantage. Vous ne devez pas supprimer directement l’` QObject ` s’il existe dans un thread différent de celui en cours d’exécution. Utilisez plutôt ` deleteLater()`, ce qui entraînera la suppression de l’objet par la boucle d’événements 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 ne déclenchera aucune action sur les éléments qui y sont connectés). Si ` block ` est faux, aucun blocage de ce type ne se produira.
La valeur renvoyée est la valeur précédente de signalsBlocked().
Notez que le signal destroyed() sera émis même si les signaux de cet objet ont été bloqués.
Les signaux émis pendant le blocage 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 des événements liés aux enfants. L'événement est transmis via le paramètre event.
QEvent::ChildAdded Les événements ` 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 de ` ChildAdded `, l’enfant n’est pas encore entièrement construit, et dans le cas de ` ChildRemoved `, il a peut-être déjà été détruit.)
QEvent::ChildPolished Des événements sont envoyés aux widgets lorsque des enfants sont finalisés, ou lorsque des enfants déjà finalisés sont ajoutés. Si vous recevez un événement « child polished », la construction de l’enfant est généralement terminée. Cependant, cela n’est pas garanti, et plusieurs événements « polished » peuvent être émis 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 fait l’objet de plusieurs opérations de « polish » au cours de sa construction et de sa destruction, vous pouvez recevoir plusieurs événements `child polished` pour le même enfant, chacun avec une table virtuelle différente.
Voir également 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 ; en d’autres termes, les nouveaux enfants sont ajoutés à la fin.
Notez que l’ordre de la liste change lorsque les enfants de ` QWidget ` sont de type ` 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 également 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 entre l'type spécifiée, provenant de l'signal de l'objet sender, et l'method de l'objet receiver. Renvoie un descripteur de connexion qui pourra être utilisé ultérieurement pour la déconnecter.
Le descripteur de connexion sera invalide si la connexion ne peut pas être établie, par exemple si les paramètres sont invalides. Vous pouvez vérifier si l’ QMetaObject::Connection est valide en le convertissant en booléen.
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 également 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 entre l’ type spécifié, issu de l’ signal de l’objet sender, et le method de l’objet receiver. Renvoie un descripteur de connexion qui peut être utilisé ultérieurement pour la déconnecter.
Vous devez utiliser les macros ` SIGNAL() ` et ` SLOT() ` lorsque vous spécifiez ` 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 contenir aucun nom de variable, mais uniquement le type. Par exemple, le code suivant ne fonctionnerait pas et renverrait false :
// 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 MyWidget transmet un signal provenant d’une variable membre privée et le rend accessible sous un nom lié à MyWidget.
Un signal peut être connecté à plusieurs slots et signaux. Plusieurs signaux peuvent être connectés à un même slot.
Si un signal est connecté à plusieurs slots, ceux-ci sont activés dans l’ordre dans lequel les connexions ont été établies, lorsque le signal est émis.
La fonction renvoie un ` QMetaObject::Connection ` représentant un descripteur de connexion si elle parvient à connecter le signal au slot. Le descripteur de connexion sera invalide si la connexion ne peut pas être établie, par exemple si ` QObject ` ne parvient pas à vérifier l’existence de ` signal ` ou de ` method`, ou si leurs signatures ne sont pas compatibles. Vous pouvez vérifier si le descripteur est valide en le convertissant en `bool`.
Par défaut, un signal est émis pour chaque connexion établie ; deux signaux sont émis en cas de connexions en double. Vous pouvez interrompre toutes ces connexions à l’aide d’un seul appel à ` disconnect()`. Si vous passez l'Qt::UniqueConnection type , la connexion ne sera établie que si elle n'est pas en double. S'il existe déjà un doublon (exactement le même signal vers exactement le même slot sur les mêmes objets), la connexion échouera et la fonction `connect` renverra un ` QMetaObject::Connection` invalide.
Remarque : les Qt ::UniqueConnections ne fonctionnent pas pour les lambdas, les fonctions non-membres et les foncteurs ; elles s’appliquent uniquement à la connexion à des fonctions membres.
Le paramètre facultatif ` type ` décrit le type de connexion à établir. Il détermine notamment si un signal donné est transmis immédiatement à un slot ou mis en file d’attente pour être transmis 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 arrière-plan. Si vous essayez d’utiliser une connexion mise en file d’attente et que vous obtenez le message d’erreur
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 sûre pour les threads.
Voir également disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE() et Différences entre les connexions basées sur des chaînes de caractères 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, puis renvoie un descripteur vers cette connexion
Le signal doit être une fonction déclarée en tant que signal dans l’en-tête. La fonction de slot peut être n’importe quelle fonction ou foncteur pouvant être connecté au signal. Une fonction de slot peut être connectée à un signal donné si ce dernier possède au moins autant d’arguments que la fonction de slot. Il doit exister une conversion implicite entre les types des arguments correspondants du signal et du 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'émetteur est détruit. Cependant, vous devez veiller à ce que tous les objets utilisés au sein du foncteur soient toujours actifs lorsque le signal est émis.
C’est pourquoi il est recommandé d’utiliser la surcharge de la fonction `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 thread-safe.
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
Relie signal de l'objet sender à method de cet objet.
Équivalent à connect(sender, signal, this, method, type).
Chaque connexion établie émet un signal ; ainsi, les connexions en double émettent deux signaux. Vous pouvez interrompre une connexion à l'aide de la fonction disconnect().
Cette fonction surcharge la fonction QObject::connect().
Remarque : cette fonction est thread-safe.
Voir également 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 objet ` type ` donné, provenant de ` signal ` dans ` sender `, vers ` functor ` afin de l'intégrer dans une boucle d'événements spécifique de ` context`, et renvoie un descripteur vers cette connexion.
Remarque : les Qt ::UniqueConnections ne fonctionnent pas avec les lambdas, les fonctions non membres et les functors ; elles s’appliquent uniquement à la connexion à des fonctions membres.
Le signal doit être une fonction déclarée en tant que signal dans l’en-tête. La fonction slot peut être n’importe quelle fonction ou foncteur pouvant être connecté au signal. Une fonction slot peut être connectée à un signal donné si ce dernier possède 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 dans 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éconnectera automatiquement si l'émetteur ou le contexte est détruit. Cependant, vous devez veiller à ce que tous les objets utilisés au sein du foncteur soient encore actifs 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 thread-safe.
[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 entre l'type donné de l'signal dans l'objet sender et le method dans l'objet receiver. Renvoie un descripteur de connexion qui peut être utilisé pour la déconnecter ultérieurement.
Le signal doit être une fonction déclarée en tant que signal dans l’en-tête. La fonction de slot peut être n’importe quelle fonction membre pouvant être connectée au signal. Un slot peut être connecté à un signal donné si ce dernier possède au moins autant d’arguments que le slot, et s’il existe une conversion implicite entre les types des arguments correspondants dans le signal et dans le slot.
Exemple :
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText);Cet exemple garantit que l’étiquette affiche toujours le texte actuel de la zone de saisie.
Un signal peut être connecté à plusieurs slots et signaux. Plusieurs signaux peuvent être connectés à un même slot.
Si un signal est connecté à plusieurs slots, ceux-ci 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 descripteur de connexion si elle parvient à connecter le signal au slot. Le descripteur de connexion sera invalide si la connexion ne peut pas être établie, par exemple si la fonction ` QObject ` ne parvient pas à vérifier l’existence de ` signal ` (si celui-ci n’a pas été déclaré comme signal). Vous pouvez vérifier si l’ QMetaObject::Connection est valide en le convertissant en booléen.
Par défaut, un signal est émis pour chaque connexion que vous établissez ; deux signaux sont émis en cas de connexions en double. Vous pouvez interrompre toutes ces connexions à l’aide d’un seul appel à disconnect(). Si vous passez l’ type Qt::UniqueConnection , la connexion ne sera établie que si elle n’est pas en double. S’il existe déjà un doublon (exactement le même signal vers exactement le même slot sur les mêmes objets), la connexion échouera et connect renverra un QMetaObject::Connection invalide.
Le paramètre facultatif ` type ` décrit le type de connexion à établir. Il détermine notamment si un signal donné est transmis immédiatement à un slot ou mis en file d’attente pour être transmis ultérieurement. Si le signal est mis en file d’attente, les paramètres doivent être de types reconnus par le système de méta-objets de Qt, car Qt doit copier les arguments pour les stocker dans un événement en arrière-plan. Si vous essayez d’utiliser une connexion en file d’attente et que vous obtenez le message d’erreur
QObject::connect: Cannot queue arguments of type 'MyType'
(Make sure 'MyType' is registered using qRegisterMetaType().), veillez à 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 thread-safe.
Voir également 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 lorsqu'un élément a été connecté à ` signal ` dans cet objet.
Si vous souhaitez comparer la propriété ` signal ` à un signal spécifique, vous pouvez utiliser la fonction ` QMetaMethod::fromSignal()` comme suit :
if (signal == QMetaMethod::fromSignal(&MyObject::valueChanged)) {
// signal is valueChanged
}Avertissement : cette fonction enfreint le principe de modularité de la programmation orientée objet. Elle peut toutefois s’avérer utile lorsque vous devez effectuer une opération coûteuse uniquement si un élément est connecté à un signal.
Avertissement : cette fonction est appelée depuis le thread qui effectue la connexion, lequel peut être différent du thread dans lequel réside cet objet. Cette fonction peut également être appelée alors qu’un mutex interne d’ QObject est verrouillé. Il est donc interdit de réentrer dans toute fonction de QObject, y compris isSignalConnected(), depuis votre réimplémentation. Si vous verrouillez un mutex dans votre réimplémentation, assurez-vous de ne pas appeler les fonctions QObject avec ce mutex verrouillé ailleurs, sous peine de provoquer un blocage.
Voir également connect() et disconnectNotify().
[virtual protected] void QObject::customEvent(QEvent *event)
Ce gestionnaire d'événements peut être réimplémenté dans une sous-classe afin de recevoir des événements personnalisés. Les événements personnalisés sont des événements définis par l'utilisateur dont la valeur de type est au moins aussi grande que l'élément « QEvent::User » de l'énumération « QEvent::Type » ; il s'agit généralement d'une sous-classe de « QEvent ». L'événement est transmis via le paramètre « event ».
Voir également event() et QEvent.
[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, si deleteLater() est appelée sur un objet avant l'appel de ` QCoreApplication::exec()`), l'objet sera supprimé dès que la boucle d'événements sera lancée. Si deleteLater() est appelée après l’arrêt de la boucle d’événements principale, l’objet ne sera pas supprimé. Si deleteLater() est appelée sur un objet résidant dans un thread dont la boucle d’événements n’est pas en cours d’exécution, l’objet sera détruit à la fin du thread.
Une pratique courante lors de l’utilisation d’un QObject de travail dans une QThread consiste à connecter le signal « finished() » du thread au slot « deleteLater() » du de travail afin de garantir sa suppression en toute sécurité :
Notez que le fait d’entrer dans une nouvelle boucle d’événements ou d’en sortir (par exemple, en ouvrant une boîte de dialogue modale) n’ entraînera 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 précédente et imbriquée était encore en cours d’exécution : la boucle d’événements Qt supprimera ces objets dès que la nouvelle boucle d’événements imbriquée démarrera.
Dans les situations où Qt ne pilote pas le répartiteur 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 thread-safe.
Voir également ` destroyed()` et ` QPointer`.
[signal] void QObject::destroyed(QObject *obj = nullptr)
Ce signal est émis juste avant la destruction de l'objet obj, une fois que toutes les instances de QPointer ont été notifiées, et il ne peut pas être bloqué.
Tous les enfants de l'objet sont détruits immédiatement après l'émission de ce signal.
Voir également deleteLater() et QPointer.
[static, since 6.12] bool QObject::disconnect(QMetaObject::Connection &connection)
[static, since 6.12] bool QObject::disconnect(QMetaObject::Connection &&connection)
Déconnecter une connexion.
Si connection est de type invalid ou a déjà été déconnecté, ne rien faire et renvoyer false.
Remarque : dans les versions de Qt antérieures à la version 6.12, cette fonction ne prenait en paramètre que ` const-&`.
Ces fonctions ont été introduites dans Qt 6.12.
Voir aussi connect().
[static] bool QObject::disconnect(const QMetaObject::Connection &connection)
Déconnecte connection et le réinitialise à invalid.
Si connection n'est pas valide ou a déjà été déconnecté, ne fait rien et renvoie false.
Remarque : lesfutures versions de Qt pourraient n'accepter ici que des objets non-const.
Voir également QT_NO_DISCONNECT_CONST_CONNECTION et 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 interrompue 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.
De plus, cette fonction renvoie `false` et aucun signal ni slot n’est déconnecté si :
- signal n’est pas un membre de la classe émettrice ou de l’une de ses classes parentes.
- method n’est pas un membre de la classe réceptrice ou de l’une de ses classes parentes.
- signal l’instance ne représente pas un signal.
Remarque : utilisez la même syntaxe, qu’il s’agisse d’un pointeur vers une fonction membre ou d’une chaîne de caractères, en utilisant les macros ` SIGNAL ` et ` SLOT `, dans les appels à ` connect()` et aux méthodes `disconnect()` correspondantes.
Pour éviter toute incompatibilité, enregistrez le descripteur de connexion renvoyé par connect() et utilisez-le dans l’appel à disconnect().
Remarque : si une connexion queued connection est déconnectée, les événements déjà programmés peuvent tout de même être délivrés, ce qui entraîne l’appel du récepteur après la déconnexion.
QMetaMethod() peut être utilisé comme caractère générique dans le sens de « n’importe quel signal » ou « n’importe quel slot dans l’objet récepteur ». De la même manière, nullptr peut être utilisé pour receiver dans le sens de « n’importe quel objet récepteur ». Dans ce cas, la méthode doit également être de type QMetaMethod(). Le paramètre sender ne doit jamais être de type nullptr.
Remarque : la déconnexion de toutes les connexions signal-slot entraînera également la déconnexion du signal QObject::destroyed() s’il est connecté. Cela peut avoir un impact négatif sur les classes qui s’appuient sur ce signal pour la libération 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 également 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 l'signal, situé dans l'objet sender, de l'method, situé dans l'objet receiver. Renvoie true si la connexion est interrompue avec succès ; sinon, renvoie false.
Une connexion signal-slot est supprimée lorsque l’un des objets concernés est détruit.
La fonction disconnect() est généralement utilisée de trois manières, 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 relié à 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, qu’il s’agisse d’un pointeur vers une fonction membre ou d’une chaîne de caractères, à l’aide des macros SIGNAL et SLOT, dans les appels à connect() et disconnect() correspondants.
Pour éviter toute incompatibilité, enregistrez le descripteur de connexion renvoyé par connect() et utilisez-le dans l’appel à disconnect().
Remarque : si un « queued connection » est déconnecté, les événements déjà programmés peuvent tout de même être délivrés, ce qui entraîne l’appel du récepteur après la déconnexion.
nullptr peut être utilisé comme caractère générique, signifiant respectivement « n’importe quel signal », « n’importe quel objet récepteur » ou « n’importe quel slot de l’objet récepteur ».
L’ sender ne peut en aucun cas être nullptr. (Vous ne pouvez pas déconnecter les signaux de plusieurs objets 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 vaut nullptr, cela 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 ` seront déconnectés, et tous les autres slots resteront inchangés. L’ method doit être ` nullptr ` si ` receiver ` est omis ; il n’est donc pas possible de déconnecter un slot portant un nom spécifique sur tous les objets.
Remarque : la déconnexion de toutes les connexions signal-slot entraînera également la déconnexion du signal QObject::destroyed() s’il est connecté. Cela peut avoir un impact négatif sur les classes qui s’appuient sur ce signal pour la libération 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 thread-safe.
Voir aussi connect().
bool QObject::disconnect(const QObject *receiver, const char *method = nullptr) const
Déconnecte tous les signaux de cet objet de la liste method de receiver.
Remarque : utilisez la même syntaxe, qu'il s'agisse d'un pointeur vers une fonction membre ou d'une chaîne de caractères, en utilisant les macros SIGNAL et SLOT, dans les appels à connect() et disconnect() correspondants.
Pour éviter toute incompatibilité, enregistrez le descripteur de connexion renvoyé par connect() et utilisez-le dans l’appel à disconnect().
Remarque : si une connexion « queued connection » est déconnectée, les événements déjà programmés peuvent tout de même être délivrés, ce qui entraîne l’appel du récepteur après la déconnexion.
Une connexion signal-slot est supprimée lorsque l’un des objets impliqués est détruit.
Cette fonction surcharge la méthode 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, qu'il s'agisse d'un pointeur vers une fonction membre ou d'une chaîne de caractères, en utilisant les macros SIGNAL et SLOT, dans les appels à connect() et disconnect() correspondants.
Pour éviter toute incompatibilité, enregistrez le descripteur de connexion renvoyé par connect() et utilisez-le dans l’appel à disconnect().
Remarque : si une connexion « queued connection » est déconnectée, les événements déjà programmés peuvent tout de même être délivrés, ce qui entraîne l’appel du récepteur après la déconnexion.
Une connexion signal-slot est supprimée lorsque l’un des objets impliqués est détruit.
Remarque : la déconnexion de toutes les connexions signal-slot entraînera également la déconnexion du signal QObject::destroyed() s’il est connecté. Cela peut avoir un impact négatif sur les classes qui s’appuient sur ce signal pour la libération 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 la méthode QObject::disconnect().
Remarque : cette fonction est sûre pour les 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 interrompue avec succès ; sinon, renvoie false.
Une connexion signal-slot est supprimée lorsque l'un des objets concernés est détruit.
La fonction disconnect() est généralement utilisée 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 entre un signal spécifique et un emplacement spécifique :
nullptr peut être utilisé comme caractère générique, signifiant respectivement « n'importe quel signal », « n'importe quel objet récepteur » ou « n'importe quel emplacement dans l'objet récepteur ».
L'sender ne peut en aucun cas être nullptr. (Vous ne pouvez pas déconnecter des signaux de plusieurs objets en un seul appel.)
Si signal est nullptr, cela déconnecte receiver et method de tout signal. Sinon, seul le signal spécifié est déconnecté.
Si receiver est nullptr, cela déconnecte tout ce qui est connecté à signal. Sinon, seuls les slots du récepteur spécifié sont déconnectés. La fonction disconnect() avec un receiver non nul déconnecte également les fonctions de slot qui étaient connectées avec receiver comme objet de contexte.
Si method est nullptr, cela déconnecte tout ce qui est connecté à receiver. Sinon, seuls les slots nommés method seront déconnectés, et tous les autres slots resteront inchangés. Le method doit être nullptr si receiver est omis ; il n’est donc pas possible de déconnecter un slot portant un nom spécifique 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 rompra pas non plus les connexions établies à l’aide de la version sous forme de chaîne de caractères de ` connect()`. Pour rompre ces connexions, utilisez la surcharge correspondante sous forme de chaîne de caractères de `disconnect()`.
Cette fonction surcharge la fonction QObject::disconnect().
Remarque : cette fonction est thread-safe.
Voir aussi connect().
[virtual protected] void QObject::disconnectNotify(const QMetaMethod &signal)
Cette fonction virtuelle est appelée lorsqu'un élément a été déconnecté de signal dans cet objet.
Voir connectNotify() pour un exemple illustrant comment comparer signal à un signal spécifique.
Si tous les signaux ont été déconnectés de cet objet (par exemple, si l’argument signal de la fonction disconnect() était nullptr), la fonction disconnectNotify() n’est appelée qu’une seule fois, et l’ signal sera une valeur non valide QMetaMethod (la fonctionQMetaMethod::isValid() renvoie false).
Avertissement : cette fonction enfreint le principe de modularité de la programmation orientée objet. Elle peut toutefois s’avérer utile pour optimiser l’accès à des ressources coûteuses.
Avertissement : cette fonction est appelée depuis le thread qui effectue la déconnexion, lequel peut être différent du thread dans lequel réside cet objet. Cette fonction peut également être appelée alors qu’un mutex interne de ` QObject ` est verrouillé. Il est donc interdit de réentrer dans toute fonction de ` QObject `, y compris ` isSignalConnected()`, depuis votre réimplémentation. Si vous verrouillez un mutex dans votre réimplémentation, assurez-vous de ne pas appeler les fonctions QObject avec ce mutex verrouillé ailleurs, sous peine de provoquer un blocage.
Voir également disconnect() et connectNotify().
void QObject::dumpObjectInfo() const
Affiche dans la sortie de débogage des informations concernant les connexions de signaux, etc., pour cet objet.
Remarque : avant Qt 5.9, cette fonction n'était pas de type const.
Voir également ` dumpObjectTree()`.
void QObject::dumpObjectTree() const
Affiche l'arborescence des éléments enfants dans la sortie de débogage.
Remarque : avant Qt 5.9, cette fonction n'était pas de type 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 la fonction ` setProperty()`.
[virtual] bool QObject::event(QEvent *e)
Cette fonction virtuelle reçoit les événements d'un objet et doit renvoyer « true » si l'événement e a été détecté 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 parente pour tous les événements que vous n’avez pas géré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é en tant que filtre d'événements pour l'objet « watched ».
Dans votre réimplémentation de cette fonction, si vous souhaitez exclure l'event, c'est-à-dire empêcher qu'il ne soit traité davantage, renvoyez true ; sinon, renvoyez false.
Exemple :
class MainWindow : public QMainWindow
{
public:
MainWindow() ;
protected:
bool eventFilter(QObject*obj, QEvent*ev) override;
private:
QTextEdit*textEdit;
};
MainWindow::MainWindow()
{
textEdit = new QTextEdit;
setCentralWidget(textEdit);
textEdit->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject*obj, QEvent*event)
{
if (obj== textEdit) {
if (event->type()== QEvent::KeyPress) {
QKeyEvent*keyEvent = static_cast<QKeyEvent*>(event);
qDebug() << "Ate key press" << keyEvent->key();
return true;
} else {
return false;
}
} else {
// transmettre l'événement à la classe parente
return QMainWindow::eventFilter(obj, event);
}
}Notez dans l'exemple ci-dessus que les événements non gérés sont transmis à la fonction eventFilter() de la classe de base, car celle-ci a peut-être réimplémenté eventFilter() à des fins internes.
Certains événements, tels que ` QEvent::ShortcutOverride `, doivent être explicitement acceptés (en appelant ` accept()` sur ceux-ci) afin d'empêcher leur propagation.
Avertissement : si vous supprimez l'objet récepteur dans cette fonction, veillez à renvoyer true. Sinon, Qt transmettra l'événement à l'objet supprimé et le programme risque de planter.
Voir également installEventFilter().
template <typename T> T QObject::findChild(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Renvoie l’enfant de cet objet pouvant être converti en type T et appelé « name », ou « nullptr » s’il n’existe aucun objet de ce type. Un argument « name » nul entraîne la correspondance de tous les objets. Un argument « name » vide et non nul ne correspond qu’aux objets dont le champ « objectName » est vide. La recherche est effectuée de manière récursive, sauf si « options » spécifie l’option « FindDirectChildrenOnly ».
S’il y a plusieurs enfants correspondant à la recherche, l’ancêtre le plus direct est renvoyé. S’il y a plusieurs ancêtres les plus directs, le premier enfant de 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 de type « 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 de type ` QListWidget ` de ` parentWidget`, son parent direct :
QListWidget *list = parentWidget->findChild<QListWidget *>(Qt::FindDirectChildrenOnly);Remarque : dans les versions de Qt antérieures à la version 6.7, cette fonction prenait name comme QString, et non comme QAnyStringView.
Voir également findChildren().
[since 6.7] template <typename T> T QObject::findChild(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Renvoie l'enfant de cet objet pouvant être converti en type T, ou nullptr s'il n'existe aucun objet de ce type. La recherche est effectuée de manière récursive, sauf si options spécifie l'option FindDirectChildrenOnly.
S’il existe plusieurs enfants correspondant à la recherche, l’ancêtre le plus direct est renvoyé. S’il existe plusieurs ancêtres les plus directs, le premier enfant de ` 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 également ` findChildren()`.
template <typename T> QList<T> QObject::findChildren(QAnyStringView name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Renvoie tous les enfants de cet objet dont l’ name est conforme à la spécification donnée et pouvant être convertis en type T, ou une liste vide s’il n’existe aucun objet de ce type. Un argument name nul entraîne la sélection de tous les objets, tandis qu’un argument vide ne sélectionne que ceux dont l’ objectName est vide. 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 des QWidgets enfants de l’ parentWidget spécifiée nommée widgetname:
Cet exemple renvoie tous les QPushButtons qui sont des enfants de parentWidget:
QList<QPushButton *> allPButtons = parentWidget->findChildren<QPushButton *>();Cet exemple renvoie toutes les QPushButtons qui sont des enfants directs de parentWidget:
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(Qt::FindDirectChildrenOnly);Remarque : dans les versions de Qt antérieures à la version 6.7, cette fonction prenait name sous la forme QString, et non QAnyStringView.
Voir également findChild().
[since 6.3] template <typename T> QList<T> QObject::findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Renvoie tous les enfants de cet objet pouvant être convertis en type T, ou une liste vide s’il n’existe aucun objet de ce type. La recherche est effectuée de manière récursive, sauf si l’ options e spécifie l’option FindDirectChildrenOnly.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.3.
Voir également 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 convertis en type T et dont les noms correspondent à l'expression régulière re, ou une liste vide s'il n'existe aucun objet de ce type. La recherche est effectuée de manière récursive, sauf si options spécifie l'option FindDirectChildrenOnly.
Cette fonction surcharge la méthode QObject::findChildren().
bool QObject::inherits(const char *className) const
Renvoie « true » si cet objet est une instance d’une classe héritant de « className » ou d’une sous-classe de « QObject » héritant 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 convertir, envisagez plutôt d’utiliser qobject_cast<Type *>(object).
Voir également metaObject() et qobject_cast().
void QObject::installEventFilter(QObject *filterObj)
Installe un filtre d'événements 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 intercepter l'événement, soit le transmettre à cet objet. Le filtre d'événements filterObj reçoit les événements via sa fonction eventFilter(). La fonction eventFilter() doit renvoyer true si l'événement doit être filtré (c'est-à-dire intercepté) ; sinon, elle doit renvoyer false.
Si plusieurs filtres d’événements sont installés sur un même objet, c’est le filtre installé en dernier qui est activé en premier.
Si la fonction ` filterObj ` a déjà été installée pour cet objet, cette fonction la déplace de manière à ce qu’elle se comporte comme si elle avait été installée en dernier.
Voici une classe d’ KeyPressEater qui intercepte les frappes de ses objets surveillés :
class KeyPressEater : public QObject
{
Q_OBJECT
public:
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 de l'événement
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()`, veillez à renvoyer `true`. Si vous renvoyez `false`, Qt envoie l'événement à l'objet supprimé et le programme plante.
Notez que l’objet de filtrage doit se trouver dans le même thread que cet objet. Si filterObj se trouve dans un thread différent, cette fonction ne fait rien. Si filterObj ou cet objet sont déplacés vers un autre thread après l’appel de cette fonction, le filtre d’événements ne sera pas appelé tant que les deux objets n’auront pas retrouvé la même affinité de thread (elle n’ est pas supprimée).
Voir également removeEventFilter(), eventFilter() et event().
[noexcept, since 6.11] bool QObject::isQmlExposed() const
Indique si l'objet a été créé par le moteur QML ou si la propriété a été explicitement définie via la fonction ` 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 de cette fonction équivaut à l'appel de ` inherits("QQuickItem")`, à ceci près qu'elle est beaucoup plus rapide.
Cette fonction a été introduite dans Qt 6.4.
[protected] bool QObject::isSignalConnected(const QMetaMethod &signal) const
Renvoie ` true ` si l'signal est connecté à au moins un récepteur ; sinon, renvoie ` false`.
signal doit être un membre de type 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.
Avertissement : dans une application multithread, il n’est pas garanti que des appels consécutifs à cette fonction produisent les mêmes résultats.
Avertissement : cette fonction enfreint le principe de modularité de la programmation orientée objet. En particulier, cette fonction ne doit pas être appelée depuis une redéfinition de connectNotify() ou disconnectNotify(), car celles-ci pourraient être appelées depuis n'importe quel thread.
Voir aussi receivers().
bool QObject::isWidgetType() const
Renvoie « true » si l'objet est un widget ; sinon, renvoie « false ».
L'appel de cette fonction équivaut à l'appel de ` inherits("QWidget")`, à la différence près qu'elle est beaucoup plus rapide.
bool QObject::isWindowType() const
Renvoie ` true ` si l'objet est une fenêtre ; sinon, renvoie ` false`.
L'appel de cette fonction équivaut à l'appel de ` inherits("QWindow")`, à ceci près qu'elle est beaucoup plus rapide.
void QObject::killTimer(int id)
Arrête le minuteur associé à l'identifiant de minuteur, id.
L'identifiant du minuteur est renvoyé par la fonction startTimer() lorsqu'un événement de minuteur est lancé.
Voir également 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 vers 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 slots. Toute sous-classe de ` QObject ` qui contient la macro ` Q_OBJECT ` disposera d’un méta-objet.
Les informations du méta-objet sont requises par le mécanisme de connexion signal/slot et par le système de propriétés. La fonction ` inherits()` utilise également le méta-objet.
Si vous ne disposez d’aucun pointeur vers une instance d’objet réelle mais que vous souhaitez tout de même 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 également ` staticMetaObject`.
bool QObject::moveToThread(QThread *targetThread)
Modifie l'affinité de thread de cet objet et de ses enfants, et renvoie ` true ` en cas de succès. L'objet ne peut pas être déplacé s'il possède un parent. Le traitement des événements se poursuivra dans le ` targetThread`.
Pour déplacer un objet vers le thread principal, utilisez ` QApplication::instance()` pour récupérer un pointeur vers l’application en cours, puis utilisez ` QApplication::thread()` pour récupérer le thread dans lequel réside l’application. Par exemple :
myObject->moveToThread(QApplication::instance()->thread());Si targetThread est égal à nullptr, tout le traitement des événements pour cet objet et ses enfants s’arrête, car ils ne sont plus associés à aucun thread.
Notez que toutes les minuteries actives de l’objet seront réinitialisées. Les minuteries sont d’abord arrêtées dans le thread actuel, puis redémarrées (avec le même intervalle) dans le thread targetThread. Par conséquent, le fait de déplacer constamment un objet d’un thread à l’autre peut retarder indéfiniment les événements de minuterie.
Un événement « QEvent::ThreadChange » est envoyé à cet objet juste avant que l’affinité du thread ne soit modifiée. Vous pouvez gérer cet événement pour effectuer tout traitement particulier. Notez que tout nouvel événement envoyé à cet objet sera géré dans le « targetThread », à condition que celui-ci ne soit pas « nullptr » : lorsqu’il est « nullptr », aucun traitement d’événement ne peut avoir lieu pour cet objet ou ses enfants, car ils ne sont plus associés à aucun thread.
Avertissement : cette fonction n’ est pas thread-safe ; le thread actuel doit correspondre à l’affinité de thread actuelle. En d’autres termes, cette fonction ne peut que « pousser » un objet du thread actuel vers un autre thread ; elle ne peut pas « tirer » un objet depuis un thread arbitraire vers le thread actuel. Il existe toutefois une exception à cette règle : les objets sans affinité de thread peuvent être « tirés » vers le thread actuel.
Dans les versions de Qt antérieures à la version 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 une fois que le nom de l'objet a été modifié. Le nouveau nom de l'objet est transmis sous la forme « objectName ».
Remarque : il s'agit d'un signal privé. Il peut être utilisé dans des connexions de signaux, mais ne peut pas être émis par l'utilisateur.
Remarque : signalde notification pour la propriété objectName.
Voir également QObject::objectName.
QObject *QObject::parent() const
Renvoie un pointeur vers l'objet parent.
Voir également 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, le variant renvoyé n'est pas valide.
Des informations sur toutes les propriétés disponibles sont fournies par les fonctions metaObject() et dynamicPropertyNames().
Voir également setProperty(), QVariant::isValid(), metaObject() et dynamicPropertyNames().
[protected] int QObject::receivers(const char *signal) const
Renvoie le nombre de récepteurs connectés à l'signal.
Étant donné que les slots et les signaux peuvent tous deux servir de récepteurs pour les signaux, et que les mêmes connexions peuvent être établies plusieurs fois, le nombre de récepteurs correspond au nombre de connexions établies à partir de ce signal.
Lorsque vous appelez cette fonction, vous pouvez utiliser la macro SIGNAL() pour passer 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.
Avertissement : dans une application multithread, il n’est pas garanti que des appels consécutifs à cette fonction produisent les mêmes résultats.
Avertissement : cette fonction enfreint le principe de modularité de la programmation orientée objet. En particulier, cette fonction ne doit pas être appelée depuis une redéfinition de ` connectNotify()` ou ` disconnectNotify()`, car celles-ci pourraient être appelées depuis n’importe quel thread.
Voir aussi isSignalConnected().
void QObject::removeEventFilter(QObject *obj)
Supprime un objet filtre d'événement obj de cet objet. La requête est ignorée si aucun filtre d'événement de ce type n'a été installé.
Tous les filtres d'événements associés à cet objet sont automatiquement supprimés lorsque celui-ci est détruit.
Il est toujours sans risque de supprimer un filtre d'événement, même pendant son activation (c'est-à-dire à partir de la fonction eventFilter()).
Voir également installEventFilter(), eventFilter() et event().
[protected] QObject *QObject::sender() const
Renvoie un pointeur vers l'objet qui a envoyé le signal, si la fonction est appelée dans un slot activé par un signal ; sinon, elle renvoie ` nullptr`. Le pointeur n'est valide que pendant l'exécution du slot qui appelle cette fonction depuis le contexte de 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.
Avertissement : cette fonction enfreint le principe de modularité de la programmation orientée objet. Cependant, il peut être utile d’accéder à l’émetteur lorsque de nombreux signaux sont connectés à un seul slot.
Avertissement : comme mentionné ci-dessus, la valeur de retour de cette fonction n’est pas valide lorsque le slot est appelé via une fonction ` Qt::DirectConnection ` depuis 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, lequel est un membre de la classe renvoyée par la fonction ` sender()`. Si cette fonction est appelée en dehors d'un slot activé par un signal, elle renvoie -1.
Pour les signaux comportant 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 indices différents (avec et sans le paramètre), mais cette fonction renverra toujours l’index avec un paramètre. Cela ne s’applique pas lors de la surcharge de signaux avec des paramètres différents.
Avertissement : cette fonction enfreint le principe de modularité de la programmation orientée objet. Cependant, l’accès à l’index du signal peut s’avérer utile lorsque de nombreux signaux sont connectés à un même slot.
Avertissement : la valeur renvoyée par cette fonction n’est pas valide lorsque le slot est appelé via une « 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)
Définit le nom de l'objet sur « name ».
Remarque : fonctionde définition pour la propriété objectName.
Voir aussi objectName().
[since 6.4] void QObject::setObjectName(QAnyStringView name)
Remarque : fonctionde définition pour 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 également parent() et children().
bool QObject::setProperty(const char *name, const QVariant &value)
Définit la valeur de la propriété « name » de l'objet sur « value ».
Si la propriété est définie dans la classe à l'aide de ` Q_PROPERTY `, la fonction renvoie `true` 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'apparaît donc pas dans le méta-objet, elle est ajoutée en tant que propriété dynamique et la fonction renvoie `false`.
Des informations sur toutes les propriétés disponibles sont fournies par les méthodes ` metaObject()` et ` dynamicPropertyNames()`.
Les propriétés dynamiques peuvent être interrogées à nouveau à l’aide de ` property()` et peuvent être supprimées en attribuant à la propriété une valeur ` QVariant` non valide. La modification de la valeur d’une propriété dynamique entraîne l’envoi d’un événement ` QDynamicPropertyChangeEvent ` à l’objet.
Remarque : les propriétés dynamiques commençant par « _q_ » sont réservées à un usage interne.
Voir également property(), metaObject(), dynamicPropertyNames() et QMetaProperty::write().
[since 6.6] bool QObject::setProperty(const char *name, QVariant &&value)
Cette fonction surcharge la fonction ` 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 ».
Par défaut, les signaux ne sont pas bloqués.
Voir également blockSignals() et QSignalBlocker.
int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
Il s'agit d'une fonction surchargée qui lance un minuteur de type timerType avec un délai d'expiration 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 valeur sera réinitialisée à 1 ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il pouvait arrêter le minuteur s’il était en cours d’exécution ou ne pas le démarrer du tout).
Voir également timerEvent(), killTimer(), QChronoTimer et QBasicTimer.
int QObject::startTimer(std::chrono::nanoseconds interval, Qt::TimerType timerType = Qt::CoarseTimer)
Lance un minuteur et renvoie un identifiant de minuteur, ou renvoie zéro si le minuteur n'a pas pu être lancé.
Un événement de minuteur se produira toutes les interval jusqu’à ce que la fonction killTimer() soit appelée. Si interval est égal à std::chrono::duration::zero(), alors l’événement de minuteur se produit une fois à chaque retour du contrôle à la boucle d’événements, c’est-à-dire lorsqu’il n’y a plus d’événements natifs du système de fenêtrage à traiter.
À partir de Qt 6.10, la définition d’un intervalle négatif entraîne un avertissement d’exécution et la valeur est réinitialisée à 1 ms. Avant Qt 6.10, un Qt Timer vous permettait de définir un intervalle négatif, mais se comportait de manière imprévisible (par exemple, il pouvait arrêter le minuteur s’il était en cours d’exécution ou ne pas le démarrer du tout).
La fonction virtuelle ` timerEvent()` est appelée avec la classe de paramètre d’événement ` QTimerEvent ` lorsqu’un événement de minuterie se produit. Réimplémentez cette fonction pour récupérer les événements de minuterie.
Si plusieurs minuteurs sont en cours d'exécution, la méthode ` QTimerEvent::id()` peut être utilisée pour déterminer quel minuteur a été activé.
Exemple :
class MyObject : public QObject
{
Q_OBJECT
public:
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(50 ms);
startTimer(5 s);
startTimer(10 min);
startTimer(1 h);
}
void MyObject::timerEvent(QTimerEvent*event)
{
qDebug() << "Timer ID:" << event->id();
}Notez que la précision du minuteur dépend du système d’exploitation et du matériel utilisés.
L’argument timerType vous permet de personnaliser la précision du minuteur. Consultez Qt::TimerType pour plus d’informations sur les différents types de minuteurs. La plupart des plateformes prennent en charge une précision de 20 millisecondes ; certaines offrent davantage. Si Qt n’est pas en mesure de fournir le nombre d’événements de minuteur demandé, il en ignorera certains sans avertissement.
Les classes ` QTimer ` et ` QChronoTimer ` fournissent une interface de programmation de haut niveau avec des minuteries à déclenchement 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 fastidieuse que l’utilisation directe des identifiants de minuterie.
Remarque : à partir de Qt 6.8, le type de ` interval ` est ` std::chrono::nanoseconds` ; auparavant, il s'agissait de ` std::chrono::milliseconds`. Ce changement est rétrocompatible avec les anciennes versions de Qt.
Remarque : dans Qt 6.8, la méthode ` QObject ` a été modifiée pour utiliser ` Qt::TimerId ` afin de représenter les identifiants de minuterie. Cette méthode convertit ` TimerId ` en `int` pour des raisons de compatibilité ascendante ; toutefois, 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 également timerEvent(), killTimer(), QChronoTimer et QBasicTimer.
QThread *QObject::thread() const
Renvoie le thread dans lequel réside 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 afin de recevoir les événements de temporisation liés à l'objet.
QChronoTimer Il fournit des interfaces de plus haut niveau pour la fonctionnalité de minuterie, ainsi que des informations plus générales sur les minuteries. L'événement de minuterie est transmis via 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 en fonction d'une chaîne fournie par disambiguation et de la 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 la même sourceText est utilisée dans différents rôles au sein d’un 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"));
...Consultez la section « Écriture du code source pour la traduction » pour une description détaillée des mécanismes de traduction de Qt en général, et la section « Désambiguïsation de textes identiques » pour plus d’informations sur la désambiguïsation.
Avertissement : cette méthode n’est réentrante que si tous les traducteurs sont installés avant son appel. L’installation ou la suppression de traducteurs pendant l’exécution des traductions n’est pas prise en charge. Cela entraînera probablement des plantages ou d’autres comportements indésirables.
Voir également ` QCoreApplication::translate()` et « Internationalisation avec Qt ».
Documentation sur les 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 slots. Toute classe contenant la macro ` Q_OBJECT ` disposera également d’un méta-objet.
Les informations du méta-objet sont requises par le mécanisme de connexion signal/slot et par le système de propriétés. La fonction inherits() utilise également le méta-objet.
Si vous disposez d’un pointeur vers 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 aussi ` metaObject()`.
Éléments non membres associés
QObjectList
[since 6.8] enum class TimerId
Ce type sert à représenter les identifiants de minuterie (par exemple, QTimer et QChronoTimer). Le type sous-jacent est int. Vous pouvez utiliser qToUnderlying() pour convertir un Qt::TimerId en int.
| Constante | Valeur | Description |
|---|---|---|
QObject::TimerId::Invalid | 0 | Représente un identifiant de minuteur sans effet ; 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 un minuteur ; tandis que ` QChronoTimer::id()` renvoie cette valeur lorsque le minuteur est inactif, c’est-à-dire que ` timer.isActive() ` renvoie ` false`. |
Cette énumération 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 l'object donné converti en type T si l'objet est de type T (ou d'une sous-classe) ; sinon, renvoie nullptr. Si object est nullptr, alors la fonction renvoie également nullptr.
La classe T doit hériter (directement ou indirectement) de QObject et être déclarée avec la macro Q_OBJECT.
Une classe est considérée comme s'héritant 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 == nullptrLa fonction qobject_cast() se comporte de manière similaire à la fonction standard C++ dynamic_cast(), avec pour avantages de ne pas nécessiter la prise en charge de RTTI et de fonctionner au-delà des limites des bibliothèques dynamiques.
qobject_cast() peut également être utilisée en conjonction avec des interfaces.
Avertissement : si T n’est pas déclaré avec la macro Q_OBJECT, la valeur de retour de cette fonction est indéfinie.
Voir également QObject::inherits().
Documentation sur les macros
[since 6.7] QT_NO_CONTEXTLESS_CONNECT
La définition de cette macro désactivera la surcharge de ` QObject::connect()` qui relie un signal à un foncteur, sans spécifier également un ` QObject ` comme objet récepteur/contexte (c'est-à-dire la surcharge à trois 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 du côté récepteur. Si cet état local est détruit, la connexion n'est pas automatiquement interrompue.
De plus, ces connexions sont toujours directes, ce qui peut poser des problèmes dans des scénarios multithreads (par exemple, si le signal est émis depuis un autre thread).
Cette macro a été introduite dans Qt 6.7.
Voir également QObject::connect et Qt::ConnectionType.
[since 6.12] QT_NO_DISCONNECT_CONST_CONNECTION
Désactive la surcharge de la méthode ` const & ` de ` QObject::disconnect()` afin d'obliger les appelants à passer des objets non constants.
Il est préférable de passer des objets non-const, car ils peuvent être réinitialisés immédiatement, ce qui libère plus rapidement les ressources. Les différentes versions de Qt gèrent différemment la surcharge const. Dans les anciennes versions de Qt, l'appel de la surcharge const avec une connexion (Connection) initialement déclarée comme ` const ` peut entraîner un comportement indéfini. Les versions actuelles de Qt sont sûres à cet égard, mais les futures versions de Qt pourraient supprimer la surcharge const ou retarder la libération des ressources jusqu'à ce que l'objet `Connection` soit réaffecté ou détruit.
Le passage d’objets non-const permet d’éviter tous les problèmes mentionnés ci-dessus.
Le code qui se compile avec cette macro activée se compile également (et ne provoque pas de comportement indéfini) sans que la macro soit activée, et ce dans toutes les versions de Qt depuis la version 5.0.
Cette macro a été introduite dans Qt 6.12.
QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
La définition de cette macro désactivera les conversions par rétrécissement et les conversions de nombres à virgule flottante en nombres entiers entre les arguments transmis par un signal et ceux 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 également QObject::connect.
Q_CLASSINFO(Name, Value)
Cette macro associe des informations supplémentaires à la classe, accessibles via la fonction ` QObject::metaObject()`. Ces informations supplémentaires se présentent sous la forme d'une chaîne de caractères de type « Name » et d'une chaîne littérale de type « 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 modules. Par exemple, lors de la définition d’un QML Object Types en C++, vous pouvez désigner une propriété comme valeur par défaut:
Q_CLASSINFO("DefaultProperty", "content")Voir également QMetaObject::classInfo(), Utilisation des adaptateurs Qt D-Bus et Définition de types QML à partir de C++.
Q_EMIT
Utilisez cette macro pour remplacer le mot-clé ` emit ` lors de l'émission de signaux, lorsque vous souhaitez utiliser les signaux et slots Qt avec un mécanisme de signaux/slots tiers.
Cette macro est généralement utilisée lorsque ` no_keywords ` est spécifié avec la variable ` CONFIG ` dans le fichier ` .pro `, mais elle peut également être utilisée même si ` no_keywords ` n' est pas spécifié.
Q_ENUM(...)
Cette macro enregistre un type énuméré auprès du système de méta-objets. Elle doit être placée après la déclaration de l'énumération dans une classe comportant 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 voient leur QMetaEnum enregistrée dans la QMetaObject qui les englobe. Vous pouvez également utiliser QMetaEnum::fromType() pour obtenir la QMetaEnum.
Les énumérations enregistrées sont automatiquement enregistrées dans le système de métatypes de Qt, ce qui les rend accessibles à ` QMetaType ` sans qu'il soit nécessaire d'utiliser ` Q_DECLARE_METATYPE()`. Cela permet d'utiliser des fonctionnalités utiles ; par exemple, si elles sont utilisées dans une ` QVariant`, vous pouvez les convertir en chaînes de caractères. De même, en les transmettant à ` QDebug `, leurs noms s'afficheront à l'écran.
Voir également le système de propriétés de Qt.
Q_ENUM_NS(...)
Cette macro enregistre un type énuméré auprès du système de méta-objets. Elle doit être placée après la déclaration de l'énumération, dans un espace de noms comportant la macro ` Q_NAMESPACE `. Elle équivaut à ` Q_ENUM `, mais dans un espace de noms.
Les énumérations déclarées avec Q_ENUM_NS voient leur QMetaEnum enregistrée dans l'QMetaObject qui les englobe. Vous pouvez également utiliser QMetaEnum::fromType() pour obtenir l'QMetaEnum.
Les énumérations enregistrées sont automatiquement enregistrées dans le système de méta-types de Qt, ce qui les rend accessibles à ` QMetaType ` sans qu’il soit nécessaire d’utiliser ` Q_DECLARE_METATYPE()`. Cela permet d’utiliser des fonctionnalités utiles ; par exemple, si elles sont utilisées dans une ` QVariant`, vous pouvez les convertir en chaînes de caractères. De même, en les transmettant à ` QDebug `, leurs noms s’afficheront à l’écran.
Voir également le système de propriétés de Qt.
Q_FLAG(...)
Cette macro enregistre une seule énumération ( flags type ) auprès du système de méta-objets. Elle est généralement utilisée dans la définition d’une classe pour indiquer que les valeurs d’une énumération donnée peuvent être utilisées comme indicateurs et combinées à l’aide de l’opérateur OR binaire. Pour les espaces de noms, utilisez plutôt la macro ` Q_FLAG_NS()`.
La macro doit être placée après la déclaration de l'énumération. La déclaration du type des indicateurs s'effectue à 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)
};Remarque : la macro Q_FLAG se charge d'enregistrer les valeurs de drapeau individuelles auprès du système de méta-objets ; il n'est donc pas nécessaire d'utiliser Q_ENUM() en plus de cette macro.
Voir également le système de propriétés de Qt.
Q_FLAG_NS(...)
Cette macro enregistre une seule énumération ( flags type ) auprès du système de méta-objets. Elle est utilisée dans un espace de noms comportant la macro ` Q_NAMESPACE `, afin de déclarer que les valeurs d’une énumération donnée peuvent être utilisées comme indicateurs et combinées à l’aide de l’opérateur OR binaire. Elle équivaut à ` Q_FLAG `, mais dans un espace de noms.
La macro doit être placée après la déclaration de l'énumération.
Remarque : la macro `Q_FLAG_NS` se charge d'enregistrer les valeurs individuelles des indicateurs auprès du système de méta-objets ; il n'est donc pas nécessaire d'utiliser ` Q_ENUM_NS()` en plus de cette macro.
Voir également le système de propriétés de Qt.
Q_GADGET
La macro Q_GADGET est une version allégée de la macro Q_OBJECT destinée aux classes qui n’héritent pas de QObject mais qui souhaitent néanmoins utiliser certaines des fonctionnalités de réflexion offertes par QMetaObject.
Remarque : l’expansionde 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 des membres de type Q_ENUM, Q_PROPERTY et Q_INVOKABLE, mais ils ne peuvent pas avoir de signaux ni de slots.
Q_GADGET rend accessible un membre de classe, staticMetaObject. staticMetaObject est de type QMetaObject et permet d’accéder aux énumérations déclarées 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 ` mise à disposition (voir Q_GADGET) est déclarée avec le qualificateur ` EXPORT_MACRO ` fourni. Cela s’avère utile si l’objet doit être exporté depuis une bibliothèque dynamique, mais que la classe qui l’englobe ne doit pas l’être dans son ensemble (par exemple, parce qu’elle se compose principalement de fonctions inline).
Remarque : l’expansionde 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: »).
Par exemple :
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 également « Q_GADGET » et « Création de bibliothèques partagées ».
Q_INTERFACES(...)
Cette macro indique à Qt quelles interfaces la classe implémente. Elle est utilisée lors de l'implémentation de plugins.
Voir également Q_DECLARE_INTERFACE(), Q_PLUGIN_METADATA() et Comment créer des plugins Qt.
Q_INVOKABLE
Appliquez cette macro aux déclarations de fonctions membres afin de permettre leur invocation via le système de méta-objets. La macro s'écrit 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 auprès du système de méta-objets et permet de l’appeler à l’aide de ` QMetaObject::invokeMethod()`. La fonction ` normalMethod() ` n’étant pas enregistrée de cette manière, elle ne peut pas être appelée à l’aide de ` QMetaObject::invokeMethod()`.
Si une fonction membre invoquable renvoie un pointeur vers un ` QObject ` ou une sous-classe de ` QObject ` et qu'elle est invoquée depuis QML, des règles de propriété spécifiques s'appliquent. Pour plus d'informations, consultez la section « Conversion des types de données entre QML et C++ ».
[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 indique au Meta-Object Compiler d'ajouter une inclusion.
// Put this in your code and the generated code will include this header.
Q_MOC_INCLUDE("myheader.h")Cela s'avère utile si les types que vous utilisez comme propriétés ou comme arguments de signaux/slots sont déclarés à l'avance.
Cette macro a été introduite dans Qt 6.0.
Q_NAMESPACE
La macro Q_NAMESPACE permet d'ajouter des fonctionnalités de « QMetaObject » à un espace de noms.
Les Q_NAMESPACE peuvent comporter des Q_CLASSINFO, des Q_ENUM_NS, des Q_FLAG_NS, mais ils ne peuvent pas comporter de Q_ENUM, de Q_FLAG, de Q_PROPERTY, de Q_INVOKABLE, ni de signaux ni de slots.
Q_NAMESPACE rend disponible une variable externe, staticMetaObject. staticMetaObject est de type QMetaObject et donne accès aux énumérations déclarées avec Q_ENUM_NS/Q_FLAG_NS.
Par exemple :
namespace test {
Q_NAMESPACE
...Voir également Q_NAMESPACE_EXPORT.
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
La macro Q_NAMESPACE_EXPORT permet d'ajouter des capacités d'QMetaObject à un espace de noms.
Elle fonctionne exactement comme la macro ` Q_NAMESPACE `. Cependant, la variable externe ` staticMetaObject ` définie dans l'espace de noms est déclarée avec le qualificateur ` EXPORT_MACRO ` fourni. Cela s'avère utile si l'objet doit être exporté depuis une bibliothèque dynamique.
Par exemple :
namespace test {
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
...Voir également Q_NAMESPACE et Création de bibliothèques partagées.
Q_OBJECT
La macro Q_OBJECT sert à 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'expansionde 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 nécessite que la classe soit une sous-classe de ` QObject`. Utilisez ` Q_GADGET ` ou ` Q_GADGET_EXPORT ` à la place de `Q_OBJECT` pour activer la prise en charge des énumérations par le système de méta-objets dans une classe qui n’est pas une sous-classe de ` QObject `.
Voir également Système de méta-objets, Signaux et slots, et Système de propriétés de Qt.
Q_PROPERTY(...)
Cette macro sert à déclarer des propriétés dans les classes qui héritent de ` QObject`. Les propriétés se comportent comme des membres de données de classe, mais elles disposent de fonctionnalités supplémentaires accessibles via le 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 obligatoires. 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 il est courant de définir une fonction ` WRITE `. Les attributs ont par défaut la valeur `true`, à l’exception de ` USER`, dont la valeur par défaut est `false`.
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 complet de son utilisation, consultez la section consacrée au système de propriétés de Qt.
Voir également le système de propriétés de Qt.
Q_REVISION
Appliquez cette macro aux déclarations de fonctions membres afin de leur attribuer un numéro de révision dans le système de méta-objets. La macro s'écrit 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();
};Cela s’avère utile lorsque vous utilisez le système de méta-objets pour exposer dynamiquement des objets à une autre API, car vous pouvez ainsi vous adapter à la version attendue par différentes versions de cette 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 la méthode `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 appartenant à la révision 0 si elles ne sont pas balisées, une balise de type Q_REVISION(0) ou Q_REVISION(0, 0) est invalide et ignorée.
Vous pouvez passer un ou deux paramètres entiers à ` Q_REVISION`. Si vous passez un seul paramètre, celui-ci désigne 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 correspond à 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 de caractères plus générique, voir QMetaMethod::tag()
Voir également QMetaMethod::revision().
Q_SET_OBJECT_NAME(Object)
Cette macro attribue à Object l'objectName « Object ».
Peu importe qu'Object soit un pointeur ou non, la macro le détermine d'elle-même.
Voir également QObject::objectName().
Q_SIGNAL
Il s'agit d'une macro supplémentaire qui vous permet de marquer une fonction unique comme signal. Elle peut s'avérer très utile, notamment lorsque vous utilisez un analyseur de code source tiers qui ne prend pas en charge 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 slots Qt avec un mécanisme de signaux/slots tiers.
Cette macro est généralement utilisée lorsque no_keywords est spécifié avec la variable CONFIG dans le fichier .pro, mais elle peut également ê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 slots Qt avec un mécanisme de signaux/slots tiers.
Cette macro est généralement utilisée lorsque ` no_keywords ` est spécifié avec la variable ` CONFIG ` dans le fichier ` .pro `, mais elle peut également être utilisée même si ` 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 comme « slot ». Elle peut s'avérer très utile, notamment lorsque vous utilisez un analyseur de code source tiers qui ne prend pas en charge 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 slots Qt avec un mécanisme de signaux/slots tiers.
Cette macro est généralement utilisée lorsque no_keywords est spécifié avec la variable CONFIG dans le fichier .pro, mais elle peut également ê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 slots Qt avec un mécanisme de signaux/slots tiers.
Cette macro est généralement utilisée lorsque ` no_keywords ` est spécifié avec la variable ` CONFIG ` dans le fichier ` .pro `, mais elle peut également être utilisée même si ` 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.