C++ signal QML fente dans Qt
Je veux envoyer un Signal à partir de C++ pour une Fente dans mon Fichier QML.
J'ai déjà eu à travailler sans et de type primitif paramètres, bien que si je veux envoyer un QString
à mon QML Fente, j'obtiens une erreur alors que la connexion.
- Je me connecter en main.cpp
QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj, SIGNAL(finishedGatheringDataForItem(QString)),
contentView, SLOT(updateViewWithItem(QString)));
la relavant d'une partie 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)
- Vous n'avez pas de QString argument dans votre updateViewWithItem? (L'erreur de points)
- Désolé j'ai oublié de l'ajouter à nouveau après le test. Toujours pas de travail même si. J'ai essayé updateViewWithItem(QString) et updateViewWithItem(chaîne de caractères).
- le signal à partir de C++ signifie une bibliothèque c++ ou une classe Qt???
- juste une classe Qt normal
- merci, ce Q/r m'a vraiment aidé. pour référence future, un grand exemple est maintenant ici: github.com/andrewrjones/qml2-to-cpp-and-back-signals
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il serait mieux si vous consultez ce tutoriel:
http://doc.qt.io/qt-4.8/qtbinding.html
surtout cette section:
http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals
Je pense que votre erreur, dans ce cas, peut-être que vous n'avez pas le déclarer comme une fente ou vous n'avez pas les rendre opposables. Les deux options sont expliquées dans le Tutoriel Qt.
Aussi, vous devez utiliser un QVariant afin d'échanger des données entre le C++ et QML.
Vous pouvez également vous inscrire types, par exemple des Widgets et d'autres choses, de sorte que vous pouvez les utiliser dans QML comme un "natif" type comme un rectangle. Dans la plupart des cas, ce n'est pas recommandé, sauf si vous avez besoin d'un certain extern classe ou une partie des données que vous ne pouvez pas afficher contraire dans votre Interface QML.
La raison pour laquelle le QVariant est le Script en fonction de l'approche de QML. Le QVariant contient essentiellement de vos données et une description du type de données, de sorte que le QML sait comment le gérer correctement. C'est pourquoi vous devez spécifier le paramètre dans QML avec String, int, etc.. Mais l'origine de l'échange de données avec le C++ reste un QVariant
J'ai utilisé le qmlRegisterType avant, mais il est très gênant Solution pour les types de données simples. Il est plutôt utilisé pour des données plus complexes, tels que des Widgets personnalisés, sur Toile ou sur des éléments de la Vidéo que QML ne supporte pas nativement ou étendue
QStandardItemModels
. C'est un moyen plus pratique pour échanger des données entre QML et C++ et n'a pas besoin de Signaux ou aux machines à sous en première instance, parce que le QStandardItemModel les mises à jour de l'interface graphique automatiquement. Pour l'utilisation de la QStandardItemModel vous devez vous inscrire le Type avec qmlRegisterType.. . Le Modèle peut ensuite être utilisées dans le Modèle de base des points de Vue comme la ListView etc.J'ai joint un tutoriel pour ce sujet, il explique comment utiliser l'QListModel.
http://doc.qt.io/qt-4.8/qdeclarativemodels.html
Vous devez utiliser Connexions dans ce cas (c'est peut-être la seule façon de se connecter).
Mettre votre objet myObj de fichier QML par
setContextProperty
Votre signal est
En QML fichier, ajouter Connectios aime ci-dessous:
Connections
objet à l'intérieur du composant QML qui doit recevoir la connexion. Souvent, il sera le composant racine. Voir les exemples dans les doc.qt.io/qt-5/qml-qtqml-connections.htmlsignal
decleration).