对于不同的setContextProperties,如何将C++后端对象干净地公开给QML



我正在创建一个带有C++后端的QML应用程序。不同类型的相机可以连接到我的C++后端。这些相机具有不同类型的传感器和不同数量的电池等。根据连接的相机类型,C++后端使用setContextProperty()将对象暴露给QML。

由于我目前使用的方法,我必须检查QML中连接了哪种相机(camInfo.type(,并根据情况绑定到适当的后端对象。这在我的QML应用程序中一直使用,所以做了很多开关外壳,而且支持新的相机模型是非常不可维护的。

对于每种不同的相机型号,有没有其他方法可以将不同的后端对象暴露给QML?我不想在QML中的camInfo.type上使用任何开关情况。

如果我能做一些类似的事情,那将是更好的:

Text {                                         
y: 50                                      
x: 50                                      
text: camera.sensor0Data.sensorReading                                     
}                                          
}  

其中camera.sensor0Data.sensorReading将以某种方式"映射"到后端的apertureData.sensorReadingsensor0Data.sensorReading等中的一个。如果连接的摄像头不包括特定的传感器,那么Text将是visible:false

main.qml的代码段

Text {                                         
y: 50                                      
x: 50                                      
text: {                                    
switch(camInfo.type){                  
case 0: // DSLR                        
apertureData.sensorReading         
break                              
case 1: //MOBILE                       
sensor0Data.sensorReading          
break                              
case 2: //PointandShoot                
sensor0Data.sensorReading          
}                                      
}                                          
}                                              
Text {                                         
visible: camInfo.type==2 // Point and Shoot
y: 90                                      
x: 90                                      
text: {                                    
switch(camInfo.type){                  
case 0: // DSLR                        
case 1: //MOBILE                       
"N/A"                              
break                              
case 2: //PointandShoot                
microphoneData.sensorReading       
}                                      
}                                          
}                                              

后端.cpp

#include "backend.h"
#include <QQmlContext>
enum Model {
// types of cameras.
DSLR=0,
MOBILE_CAMERA,
POINT_AND_SHOOT
};
Backend::Backend(QQmlApplicationEngine* engine, QObject *parent) :
QObject(parent)
{
// Connecting back end object instances to front end
QQmlContext* ctxt(engine->rootContext());
ctxt->setContextProperty("camInfo", deviceInfo);
ctxt->setContextProperty("videoFeedData", videoFeedData); //video.h
switch(deviceInfo->m_type){
case DSLR:
ctxt->setContextProperty("battery0Data", battery0Data); // battery.h
ctxt->setContextProperty("battery1Data", battery1Data); // battery.h
ctxt->setContextProperty("battery2Data", battery2Data); // battery.h
ctxt->setContextProperty("apertureData", apertureData); // aperture.h
ctxt->setContextProperty("sensor1Data", sensor1Data); // sensor.h
ctxt->setContextProperty("sensor2Data", sensor2Data); // sensor.h
ctxt->setContextProperty("sensor3Data", sensor3Data); // sensor.h
break;
case MOBILE_CAMERA:
ctxt->setContextProperty("sensor0Data", sensor0Data); // sensor.h
ctxt->setContextProperty("batteryData", batteryData); // battery.h
break;
case POINT_AND_SHOOT:
ctxt->setContextProperty("microphoneData", microphoneData);
ctxt->setContextProperty("sensor0Data", sensor0Data); // sensor.h
ctxt->setContextProperty("batteryData", batteryData); // battery.h
break;
}
}

根据Dinesh的评论,使用Loader加载各种视图的想法似乎是前进的方法。我现在把他的答案贴在这里,把这个问题标记为已回答。如果@Dinesh回答,我会将他的回答标记为已接受。

制作一个类似的类

class Camera: public QObject {
Q_PROPERTY (SensorsModel sensors READ sensors NOTIFY sensorsChanged()) 
};

其中SensorsModel可以是暴露一堆传感器对象的简单QAbstractListModel,类似于Sensor { type: "battery"; minValue: 0; maxValue: 100; value: 50}

然后在QML中,您可以使用Loader加载基于相机类型的各种视图。

最新更新