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.