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.