Recherche…


Remarques

QObject classe QObject est la classe de base pour tous les objets Qt.

QObjet exemple

Q_OBJECT macro Q_OBJECT apparaît dans la section privée d'une classe. Q_OBJECT exige que la classe soit une sous-classe de QObject . Cette macro est nécessaire pour que la classe déclare ses signaux / slots et utilise le système de méta-objets Qt.

Si Meta Object Compiler (MOC) trouve la classe avec Q_OBJECT , il le traite et génère un fichier source C ++ contenant le code source du méta-objet.

Voici l'exemple de l'en-tête de classe avec Q_OBJECT et signal / slots:

#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT

public:

public slots:
    void setNumber(double number);        

signals:
    void numberChanged(double number);

private:
} 

qobject_cast

T qobject_cast(QObject *object)

Une fonctionnalité ajoutée en dérivant de QObject et en utilisant la macro Q_OBJECT est la possibilité d'utiliser le qobject_cast .

Exemple:

class myObject : public QObject
{
    Q_OBJECT
    //...
};

QObject* obj = new myObject();

Pour vérifier si obj est un type myObject et le myObject en C ++, vous pouvez généralement utiliser un dynamic_cast . Cela dépend de l'activation de RTTI lors de la compilation.

La macro Q_OBJECT des autres mains génère les contrôles de conversion et le code qui peuvent être utilisés dans le qobject_cast.

myObject* my = qobject_cast<myObject*>(obj);
if(!myObject)
{
    //wrong type
}

Cela ne dépend pas de RTTI. Et vous permet également de diffuser des limites de bibliothèque dynamiques (via les interfaces / plugins Qt).

Durée de vie et propriété de QObject

Les QObjects sont livrés avec leur propre concept de durée de vie par rapport aux pointeurs bruts, uniques ou partagés de C ++.

Les QObjects ont la possibilité de créer un objecttree en déclarant des relations parent / enfant.

Le moyen le plus simple de déclarer cette relation est de transmettre l'objet parent dans le constructeur. Comme alternative, vous pouvez définir manuellement le parent d'un QObject en appelant setParent . C'est la seule direction pour déclarer cette relation. Vous ne pouvez pas ajouter un enfant à une classe de parents mais seulement l'inverse.

QObject parent;
QObject child* = new QObject(&parent);

Lorsque parent maintenant supprimé dans stack- child , l' child sera également supprimé.

Lorsque nous QObject un objet QObject , " QObject " lui-même forme l'objet parent;

QObject parent;
QObject child* = new QObject(&parent);
delete child; //this causes no problem.

La même chose s'applique aux variables de pile:

QObject parent;
QObject child(&parent);

child sera supprimé avant parent pendant le déroulement de la pile et se désinscrire de son parent.

Remarque: vous pouvez appeler manuellement setParent avec un ordre inverse de la déclaration qui cassera la destruction automatique.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow