2012-01-12 18 views
39

Quiero enviar una señal de C++ para una ranura en mi QML Archivo. yo ya tengo trabajo y sin parámetros de tipo primitivo, aunque si quiero enviar un QString a mi ranura QML consigo un error al conectarse.señal de C++ para ranura QML en Qt

conecto en main.cpp

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

la parte relavant 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) 
+1

No tiene argumento QString en su updateViewWithItem? (Lo que indica el error) – Bart

+0

Lo siento, se me olvidó volver a agregarlo después de la prueba. Sin embargo, todavía no funciona. Intenté updateViewWithItem (QString) y updateViewWithItem (cadena). – alex

+1

señal de C++ significa una biblioteca C++ o una clase Qt ??? – UmNyobe

Respuesta

28

Creo que sería mejor si marca esta 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 su error en este caso, podría bien ser que usted no declaró como una ranura o que no lo hacen invocable. Ambas opciones se explican en el Tutorial de Qt.

Además, es necesario utilizar un QVariant con el fin de intercambiar datos entre C++ y QML. También puede registrar tipos, p. 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 de la QVariant es el enfoque basado en el guión 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 el qmlRegisterType antes, pero es una solución muy inconveniente para tipos de datos simples. Se utiliza bastante para datos más complejos, como Widgets personalizados, Canvas o elementos de video que QML no admite o extiende originalmente QStandardItemModels. 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 puede ser utilizado en el modelo basado Vistas como el ListView etc.

Os adjunto un tutorial para este tema, se describe cómo utilizar la QListModel.

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

+0

No uso una subclase QDeclarativeView aquí. Como señalé en mi pregunta, todo funciona si dejo fuera el parámetro. ¿Tengo que introducir QString en mi QML de alguna manera? – alex

+3

En ese caso, intente usar un QVariant. Tuve este problema un par de veces que QML no reconoce otros tipos de datos que QVariant. – mmoment

+0

¡Oye, eso me solucionó el problema! Todavía me pregunto si hay una mejor solución para esto. ¿Has intentado alguna vez usar qmlRegisterType? – alex

25

Debe utilizar Conexiones en este caso (tal vez es la única manera de conectar).

  1. puesto que el objeto myObj de archivo QML por `` setContextProperty

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb); 
    
  2. Su señal es

    finishedGatheringDataForItem(QString signalString) 
    
  3. En archivo QML, añadir Connectios le gusta a continuación:

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

¿Dónde en el archivo QML? – HorusKol

+0

Esto podría causar retrasos en la UI cuando se intercambian datos a alta frecuencia o en grandes cantidades. – mmoment

+2

Seguro que SIGNAL SLOT no siempre tiene un buen rendimiento. Por lo tanto, para optimizar, debe procesar los datos antes de enviarlos a través de SIGNAL. En algunos casos, si se conecta entre dos hilos, por favor tenga en cuenta que no envíe SIGNAL con una tasa tan alta, sino que bloqueará la UI. Debe crear un mecanismo para controlar la frecuencia de envío (tal vez usar temporizador o retardo) – Ken

Cuestiones relacionadas