如何干净地暴露C++;后端对象到QML,用于不同的setContextProperties? 我正在用C++后端创建QML应用程序。不同类型的相机可以连接到我的C++后端。这些相机有不同类型的传感器和不同的电池数量等。根据相机的类型,C++后端使用 SETCONTXEXPRESS()< < /C> >将对象暴露给QML。
由于我当前使用的方法,我必须检查QML中连接了什么类型的摄像头(如何干净地暴露C++;后端对象到QML,用于不同的setContextProperties? 我正在用C++后端创建QML应用程序。不同类型的相机可以连接到我的C++后端。这些相机有不同类型的传感器和不同的电池数量等。根据相机的类型,C++后端使用 SETCONTXEXPRESS()< < /C> >将对象暴露给QML。,c++,qt,qml,qt5,qqmlapplicationengine,C++,Qt,Qml,Qt5,Qqmlapplicationengine,由于我当前使用的方法,我必须检查QML中连接了什么类型的摄像头(camInfo.type),并根据这一点绑定到相应的后端对象。这在我的QML应用程序中都有使用,所以做了很多开关外壳,而且它非常难以维护,无法支持新的相机型号 对于每个不同的相机型号,是否有其他方法可以将不同的后端对象公开给QML?我不想在QML中的camInfo.type上使用任何开关盒 如果我能做以下事情,那就更好了: Text { y:
camInfo.type
),并根据这一点绑定到相应的后端对象。这在我的QML应用程序中都有使用,所以做了很多开关外壳,而且它非常难以维护,无法支持新的相机型号
对于每个不同的相机型号,是否有其他方法可以将不同的后端对象公开给QML?我不想在QML中的camInfo.type
上使用任何开关盒
如果我能做以下事情,那就更好了:
Text {
y: 50
x: 50
text: camera.sensor0Data.sensorReading
}
}
其中camera.sensor0Data.sensorReading
会以某种方式“映射”到后端的apertureData.sensorReading
,sensor0Data.sensorReading
等。如果连接的摄像头不包含特定传感器,则文本将可见: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;
}
}
#包括“backend.h”
#包括
枚举模型{
//照相机的类型。
单反=0,
移动摄像机,
定点射击
};
后端::后端(QQmlApplicationEngine*引擎,QObject*父级):
QObject(父对象)
{
//将后端对象实例连接到前端
QQmlContext*ctxt(引擎->根上下文());
ctxt->setContextProperty(“camInfo”,deviceInfo);
ctxt->setContextProperty(“videoFeedData”,videoFeedData);//video.h
开关(deviceInfo->m_类型){
案例单反:
ctxt->setContextProperty(“battery0Data”,battery0Data);//battery.h
ctxt->setContextProperty(“batteryData”,batteryData);//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
打破
手机壳摄像头:
ctxt->setContextProperty(“sensor0Data”,sensor0Data);//sensor.h
ctxt->setContextProperty(“电池数据”,电池数据);//电池.h
打破
案例点和拍摄点:
ctxt->setContextProperty(“microphoneData”,microphoneData);
ctxt->setContextProperty(“sensor0Data”,sensor0Data);//sensor.h
ctxt->setContextProperty(“电池数据”,电池数据);//电池.h
打破
}
}
根据per的评论,使用加载器加载各种视图的想法似乎是向前推进的方法。我现在把他的答案贴在这里,把这个问题标记为已回答。如果他回答了,我会把他的回答改为接受
使班级像
类摄像机:公共QObject{
Q_属性(传感器模型传感器读取传感器通知传感器更改()
};
其中,SensorsModel
可以是一个简单的QAbstractListModel
暴露一组传感器对象,比如说Sensor{type:“battery”;minValue:0;maxValue:100;value:50}
然后在QML中,您可以使用加载程序
加载基于相机类型的各种视图。提供@eyllanesc供参考。我相信我已经在我的帖子底部提供了相关的reprex,用于回答我试图问的问题。您希望我在我的最小项目中包含其他cpp文件,以便它可以运行吗?嗨,为什么不创建一个类,如class Camera:public QObject{Q_PROPERTY{SensorsModel sensors READ sensors NOTIFY sensorsChanged()}
其中SensorsModel
可以是一个简单的QAbstractListModel
公开一组传感器对象,比如说Sensor{type:“battery”;minValue:0;maxValue:100;value:50}
。然后,在QML中,您可以让加载器根据相机类型加载各种视图,或者让单个视图根据您的相机类型显示各种传感器数据requirements@Dinesh使用加载器加载各种视图的想法似乎是向前推进的方法。你能把你的建议作为这个帖子的答案吗?