2017-08-16 7 views
0

Je veux passer certains paramètres de C++ à QML, afin que QML puisse faire quelque chose avec eux.Passer des paramètres de C++ à QML

Un peu comme ceci:

void MyClass::myCplusplusFunction(int i, int j) 
{ 
    emit mySignal(i, j); 
} 

En QML, chaque fois que mySignal(i, j) est émise, je veux appeler une fonction QML et faire des choses avec i et j.

Connections { 
    target: myClass 
    // mySignal(i, j) is emitted, call myQmlFunction(i,j) 
} 

Comment ferais-je cela?

+0

https://stackoverflow.com/questions/8834147/c-signal-to-qml-slot-in-qt –

+2

Possible duplication de [C++ SIGNAL vers QML SLOT dans Qt] (https://stackoverflow.com/questions/8834147/c-signal-to-qml-slot-in-qt) – eyllanesc

+0

@eyllanesc: Ceci n'est en aucun cas un duplicata de la question liée. C'est juste lié. Dans la question que vous avez liée, l'OP essaie d'établir la connexion du côté C++. Cette question concerne la connexion du côté QML. – derM

Répondre

1

Disons que vous avez un signal à côté cpp:

void yourSignal(int i, QString t) 

Vous avez deux options:

  • Enregistrez votre classe en tant que type qml et utilisez-la comme objet qml. L'objet sera initialisé du côté de QML. reference:

    qmlRegisterType<ClassNameCPP>("com.mycompany.qmlName", 1, 0, "ClassNameQml");

Puis, en QML:

import QtQuick 2.9 
import com.mycompany.qmlName 1.0 

Item{ 
    ClassNameQml{ 
     id: myQmlClass 
     onYourSignal: { 
      console.log(i,t); // Do whatever in qml side 
     } 
    } 
} 
  • ajoutez votre classe comme une variable QML. Cette option est préférable lorsque vous devez réutiliser plusieurs fois votre objet. reference:

    view.rootContext()->setContextProperty("varName", &cppObject);

Puis, en QML:

import QtQuick 2.9 
Item{ 
    Connections{ 
     target: varName 
     // In QML for each signal you have a handler in the form "onSignalName" 
     onYourSignal:{ 
      // the arguments passed are implicitly available, named as defined in the signal 
      // If you don't know the names, you can access them with "arguments[index]" 
      console.log(i,t); // Do whatever in qml side 
     } 
    } 
} 
+0

J'ai ajouté du code QML. Je pense que cette réponse est exactement ce que Don Joe demande, en utilisant les deux scénarios possibles. – albertTaberner

+0

Maintenant, vous avez raison, je pense. +1 de moi, d'autant plus que je pense qu'il est peu probable que le PO se montrera à nouveau pour l'accepter. J'ai ajouté deux commentaires dans votre code avec quelques explications supplémentaires, j'espère que vous allez bien. – derM

0

Vous trouverez toute la documentation ici:

http://doc.qt.io/qt-4.8/qtbinding.html

+0

Merci l'homme, je l'apprécie –

+1

Comme le lien peut être mort (d'autant que vous pointez vers l'ancienne documentation Qt4.8), il serait très apprécié, si vous pouviez étendre votre réponse de manière à inclure tous les détails pertinents pour répondre à la question. Le lien ne devrait être considéré que * supplémentaire *. – derM