2017-08-27 4 views
1

Je classe C++ UserDois-je utiliser QVariant ou MyCustomType * pour passer un objet de Qml à C++?

class User : public QObject 
{ 
    Q_PROPERTY(QString login READ login WRITE setLogin NOTIFY loginChanged) 
    Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged) 
    ... 
} 

Aussi je forme QML SignIn bouton qui appelle ce code lorsque vous cliquez dessus:

var user = userComponent.createObject() 
user.login = loginTextField.text 
user.password = passwordTextField.text 
signInInteractor.signIn(user) 

SignInInteractor est une classe C++

class SignInInteractor : public QObject 
{ 
    Q_INVOKABLE void signIn(User* user); 
    Q_INVOKABLE void signIn(QVariant user); 
    ... 
} 

Et mon question est-ce que je devrais utiliser User* ou QVariant comme type d'argument? Quels avantages et inconvénients ont-ils?

+1

Utilisez les types dérivés de QObject pour interagir avec QML lorsque cela est possible. Non seulement une meilleure vérification de type, ils exposent les propriétés et les méthodes invocables tout en emballant le type à QVariant implique que votre fonction C++ doit d'abord reconnaître le type et lui donner la valeur du variant. J'utiliserais la variante si j'ai besoin de passer différents types de paramètres à la fonction. – AlexanderVX

Répondre

3

Votre type personnalisé est QObject, donc vous pouvez facilement travailler dessus au niveau QObject * de QML. Vous serez en mesure d'accéder directement aux propriétés, slots ou invocables et fonctions, sans avoir à faire quoi que ce soit d'autre.

Vous devrez cependant ajouter la macro Q_OBJECT, qui manque actuellement à votre code, afin que les types obtiennent le traitement MOC qui leur permettra de générer les méta-données nécessaires, ce que QtQuick utilisera pour l'introspection.

Si vous le passez en variante, ce sera comme un pointeur opaque, vous ne pourrez pas faire grand-chose avec QML à part le faire circuler. Cela n'a de sens que si le type n'est pas supporté par QML, et QObject ressemble plus à un citoyen de première classe.

+0

Il y a aussi 'Q_GADGET' pour les types, quand les signaux' * Changed' pour les propriétés ne sont pas nécessaires. – Orient

+0

@Orient - ce n'est pas seulement ça. Les gadgets sont toujours transmis par valeur, copiés et autres joyeusetés. Ce qui signifie que vous ne pouvez pas les obtenir par référence, ce qui signifie que vous ne pouvez pas conserver les identités d'objet. Et pour rendre l'affaire encore plus "douce", vous ne pouvez pas ** travailler avec des gadgets au niveau du pointeur explicitement. Gadgets + pointeurs + QML est un non-go. C'est une limitation de conception plutôt sévère. – dtech