enlaces qml c ++ propiedad con múltiples hilos

Estoy creando una aplicación modular. Tiene un Core , y algunos módulos, entre los cuales se encuentra un módulo de interfaz gráfica de usuario. Estos módulos se pueden iniciar a través de la línea de comando:

 myApp gui=qml=qmlFile.qml connection=serial=/dev/ttyS1 

iniciará la aplicación con una interfaz gráfica de usuario (múltiples también es posible) y una conexión en serie. Siempre hay un objeto Router , que maneja la conexión. Los guis son cargados por una clase que se ve así:

 class Gui :QObject{ Core* core; public: QQmlApplicationEngine engine; public slots: void start(){ engine.load("qrc:/gui/from/command/line.qml"); } 

En la interfaz gráfica de usuario tengo un buen qml llamado ConnectionController{} que es una forma fácil de agregar / eliminar conexiones. Pero este es solo el primero de su clase: al final, cada módulo debe tener un componente qml para controlarlo.

Todo esto funciona bien, pero ahora estoy tratando de agregar varios subprocesos. Quiero tener un RouterThread y un GuiThread . Esto en sí mismo era simplemente una cuestión de cambiar la creación del Router (por el Core ) a esto:

 m_router = new Router(this /*not as parent, just as pointer*/); m_router->moveToThread(&routerThread); 

(gui todavía vive en el hilo principal por ahora) Después de esto, todo sigue funcionando bien, excepto los enlaces de propiedades qml.

 QQmlEngine: Illegal attempt to connect to SerialConnection(0x7f58d00013a0) that is in a different thread than the QML engine 

Porque Gui y su QQmlEngine engine secundario viven en guiThread mientras que SerialConnection vive en routerThread .
Las señales y las ranuras entre Router y Gui (sin qml) funcionan, porque se manejan por defecto como asíncronas por qt. (Siempre que se definan los tipos apropiados.)

Bueno, no, no puedes acceder a los objetos roscados desde tu interfaz gráfica de usuario y tampoco debes intentarlo.

Debe crear un modelo de c ++ que viva en el hilo principal que está expuesto a qml. Dentro de este modelo, puede conectarse a las señales emitidas por sus hilos a través de una conexión en cola y vincularlas a las propias señales de los modelos. También debes asegurarte de que cuando leas datos de un objeto que pertenece a otro hilo, todo esté correctamente en mutexo o estés leyendo basura.