web-dev-qa-db-fra.com

Qu'est-ce que la propriété objectName: dans QML, pourquoi est-elle nécessaire et en quoi est-elle différente de la propriété id:

  1. Qu'est-ce que la propriété objectName: dans QML?
  2. Quels composants ont cette propriété?
  3. Pourquoi est-ce nécessaire?
  4. En quoi est-ce différent de l'id: property?
  5. Pourquoi ne puis-je pas simplement utiliser la propriété id: property?
4
Akiva

Cette propriété contient le nom de l'objet. ObjectName est une propriété QString de QObject qui, par défaut, est une QString vide.

Vous définissez généralement cette propriété lorsque vous devez rechercher des éléments QML à partir de Qt. De cette manière, il est possible d’accéder aux signaux, propriétés et fonctions d’un élément QML à partir du code Qt (C++).

Les tests de pilote automatique utilisent cette propriété pour introspecter votre application.

De interaction avec les objets QML de C++ :

Les composants QML sont essentiellement des arbres d'objets avec des enfants ayant des frères et soeurs et leurs propres enfants. Les objets enfants de composants QML peuvent être localisés à l'aide de la propriété QObject :: objectName avec QObject :: findChild () . Par exemple, si l'élément racine dans MyItem.qml avait un élément Rectangle enfant:

import QtQuick 2.0

Item {
    width: 100; height: 100

    Rectangle {
        anchors.fill: parent
        objectName: "rect"
    }
}

L'enfant pourrait être situé comme ceci:

QObject *rect = object->findChild<QObject*>("rect");
if (rect)
    rect->setProperty("color", "red");

Notez qu'un objet peut avoir plusieurs enfants avec le même nom d'objet. Par exemple, ListView crée plusieurs instances de son délégué. Ainsi, si son délégué est déclaré avec un nom d'objet particulier, ListView aura plusieurs enfants avec le même nom d'objet. Dans ce cas, QObject :: findChildren () peut être utilisé pour trouver tous les enfants avec un nom d'objet correspondant.

Avertissement : Bien qu'il soit possible d'utiliser C++ pour accéder à des objets QML et les manipuler profondément dans l'arborescence des objets, nous vous recommandons de ne pas adopter cette approche en dehors de tests d'application et prototypage. Une des forces des intégrations QML et C++ réside dans la possibilité d'implémenter l'interface utilisateur QML séparément du backend de logique et de jeu de données C++. Cette stratégie est rompue si le côté C++ pénètre profondément dans les composants QML pour les manipuler directement. Cela rendrait difficile, par exemple, l'échange d'un composant de vue QML pour une autre vue, si le nouveau composant manquait d'un nom d'objet requis. Il est préférable que l’implémentation C++ connaisse le moins possible l’implémentation de l’interface utilisateur QML et la composition de l’arborescence des objets QML.

Si un objectName est nécessaire pour les tests, cela en vaut vraiment la peine. Le nom d'objet ne doit évidemment pas être ajouté s'il n'est pas nécessaire. Lors de leur ajout, il faut suivre le consignes générales de QML en matière de performances .

Source: Quel est l’impact sur la mémoire de l’ajout d’objectNames aux éléments QML?

6
Sylvain Pineau

1: Il est utilisé pour rechercher des objets par nom

2: Tous proviennent de QObject

3: il est utilisé par le pilote automatique pour analyser votre application à partir de scénarios de test

4: Je ne suis pas vraiment sûr

5: Je ne pense pas que l'identifiant puisse être découvert depuis des outils extérieurs (comme le pilote automatique)

2
mhall119