web-dev-qa-db-fra.com

Signal C ++ vers l'emplacement QML dans Qt

Je veux envoyer un signal de C++ vers un slot dans mon fichier QML. Je l'ai déjà fait fonctionner sans paramètres de type primitifs, bien que si je veux envoyer un QString à mon slot QML, j'obtiens une erreur lors de la connexion.

Je me connecte dans main.cpp

QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj,      SIGNAL(finishedGatheringDataForItem(QString)), 
                 contentView, SLOT(updateViewWithItem(QString)));

la partie relavant de mon fichier qml

Rectangle {
        objectName: "contentView"
        function updateViewWithItem(string) { console.log('got some Items'); }  // slot
}

Erreur:

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
51
alex

Je pense que ce serait mieux si vous consultez ce tutoriel:

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

en particulier cette section:

http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals

Je pense que votre erreur dans ce cas pourrait être que vous ne l'avez pas déclaré en tant qu'emplacement ou que vous ne l'avez pas rendu invocable. Les deux options sont expliquées dans le tutoriel Qt.

De plus, vous devez utiliser un QVariant afin d'échanger des données entre C++ et QML. Vous pouvez également enregistrer des types, par exemple Widgets et autres, pour que vous puissiez les utiliser en QML comme type "natif" comme un rectangle. Dans la plupart des cas, cela n'est pas recommandé, sauf si vous avez besoin d'une certaine classe externe ou de données que vous ne pouvez pas afficher autrement dans votre interface QML.

La raison de QVariant est l'approche basée sur script de QML. Le QVariant contient essentiellement vos données et une description du type de données, afin que le QML sache comment les gérer correctement. C'est pourquoi vous devez spécifier le paramètre en QML avec String, int etc .. Mais l'échange de données d'origine avec C++ reste un QVariant

J'ai déjà utilisé le qmlRegisterType, mais c'est une solution très peu pratique pour les types de données simples. Il est plutôt utilisé pour des données plus complexes, telles que des widgets personnalisés, des éléments Canvas ou Video que QML ne prend pas en charge ou n'extend pas nativement QStandardItemModels. C'est un moyen plus pratique d'échanger des données entre QML et C++ et n'a pas besoin de signaux ou d'emplacements en première instance, car QStandardItemModel met automatiquement à jour l'interface graphique. Pour utiliser QStandardItemModel, vous devez enregistrer le type avec qmlRegisterType ... Le modèle peut ensuite être utilisé dans des vues basées sur un modèle telles que ListView, etc.

J'ai joint un tutoriel pour cette rubrique, il décrit comment utiliser le QListModel.

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

35
mmoment

Vous devez utiliser Connexions dans ce cas (c'est peut-être la seule façon de se connecter).

  1. Mettez votre objet myObj dans le fichier QML par setContextProperty

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
    
  2. Votre signal est

    finishedGatheringDataForItem(QString signalString)
    
  3. Dans le fichier QML, ajoutez les goûts Connectios ci-dessous:

    Connections {
        target: YourObject 
        onFinishedGatheringDataForItem: {
            qmlString = signalString
        }
    }
    
35
Ken