c++ qt qml signals-slots

Señal de C++ a la ranura QML en Qt



signals-slots (2)

Creo que sería mejor si revisas este tutorial:

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

especialmente esta sección:

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

Creo que tu error en este caso podría ser que no lo declaraste como un espacio o no lo hiciste invocable. Ambas opciones se explican en el Tutorial de Qt.

Además, debe usar QVariant para intercambiar datos entre C ++ y QML. También puede registrar tipos, por ejemplo, Widgets y demás, para que pueda usarlos en QML como un tipo "nativo", como un rectángulo. En la mayoría de los casos esto no es recomendable, excepto si necesita cierta clase externa o algunos datos que de otra manera no se pueden visualizar en su Interfaz QML.

La razón del QVariant es el enfoque basado en scripts de QML. QVariant básicamente contiene sus datos y una descripción del tipo de datos, de modo que el QML sepa cómo manejarlo correctamente. Es por eso que debe especificar el parámetro en QML con String, int, etc. Pero el intercambio de datos original con C ++ sigue siendo un QVariant

He usado qmlRegisterType antes, pero es una solución muy inconveniente para tipos de datos simples. Se usa bastante para datos más complejos, como Widgets personalizados, elementos Canvas o Video que QML no admite nativamente o QStandardItemModels extendido. Es una forma más conveniente de intercambiar datos entre QML y C ++ y no necesita señales o ranuras en primera instancia, porque QStandardItemModel actualiza la GUI automáticamente. Para usar QStandardItemModel, debe registrar el Tipo con qmlRegisterType ... El modelo se puede usar en vistas basadas en el modelo, como ListView, etc.

Adjunté un tutorial para este tema, que describe cómo usar QListModel.

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

Deseo enviar una señal de C ++ a un espacio en mi archivo QML. Ya lo tengo trabajando sin parámetros de tipo primitivo, aunque si deseo enviar un QString a mi ranura QML, QString un error al conectarme.

Me conecto en main.cpp

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

la parte relavante de mi archivo qml

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

Error:

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


Debería usar Connections en este caso (tal vez sea la única forma de conectarse).

  1. Coloque su objeto myObj en el archivo QML con `` setContextProperty

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);

  2. Tu señal es

    finishedGatheringDataForItem(QString signalString)

  3. En el archivo QML, agregue los me gusta de Connectios a continuación:

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