Sinal C ++ para slot QML no Qt

Eu quero enviar um sinal do C ++ para um slot no meu arquivo QML. Eu já consegui trabalhar sem parâmetros do tipo primitivo, embora se eu quiser enviar um QString para o meu QML, recebo um erro durante a conexão.

Eu me conecto no main.cpp

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

a parte relevante do meu arquivo qml

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

Erro:

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

Eu acho que seria melhor se você verificasse este tutorial:

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

especialmente esta seção:

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

Eu acho que o seu erro neste caso pode ser que você não o tenha declarado como um slot ou você não o tornou invocável. Ambas as opções são explicadas no Tutorial do Qt.

Além disso, você precisa usar um QVariant para trocar dados entre C ++ e QML. Você também pode registrar tipos, por exemplo, Widgets e outras coisas, para que você possa usá-los no QML como um tipo “nativo” como um retângulo. Na maioria dos casos, isso não é recomendado, exceto se você precisar de alguma class externa ou alguns dados que você não possa exibir em sua interface QML.

A razão para o QVariant é a abordagem baseada em script de QML. O QVariant basicamente contém seus dados e uma descrição do tipo de dados, para que o QML saiba como lidar com isso corretamente. É por isso que você tem que especificar o parâmetro em QML com String, int etc. Mas a troca de dados original com C ++ continua sendo um QVariant

Eu usei o qmlRegisterType antes, mas é uma solução muito inconveniente para tipos de dados simples. É bastante usado para dados mais complexos, como widgets personalizados, elementos Canvas ou Video, que o QML não suporta nativamente ou estende QStandardItemModels . É uma maneira mais conveniente de trocar dados entre QML e C ++ e não precisa de sinais ou slots na primeira instância, porque o QStandardItemModel atualiza a GUI automaticamente. Para usar o QStandardItemModel, você precisa registrar o Type com qmlRegisterType … O modelo pode ser usado em exibições baseadas em modelo, como ListView etc.

Anexei um tutorial para este tópico, descreve como usar o QListModel.

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

Você deve usar o Connections neste caso (talvez seja a única maneira de se conectar).

  1. Coloque seu object myObj no arquivo QML por “ setContextProperty

     qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb); 
  2. Seu sinal é

     finishedGatheringDataForItem(QString signalString) 
  3. No arquivo QML, adicione os likes do Connectios abaixo:

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