Я создаю приложение QML с бэкэндом C ++. Различные типы камер могут подключаться к моему бэкэнду C ++. Эти камеры имеют разные типы датчиков и разное количество батарей, и т. Д. c. В зависимости от того, к какому типу камеры подключен, бэкэнд C ++ предоставляет доступ к объектам в QML, используя setContextProperty()
.
. Из-за метода, который я в данный момент использую, я должен проверить, какой тип камеры подключен (camInfo.type
) в QML и, в зависимости от этого, привязать к соответствующему объекту бэкэнда. Это используется во всех моих приложениях QML, поэтому много переключений сделано, и очень трудно поддерживать новую модель камеры.
Есть ли еще какой-нибудь способ, которым я могу представить различные объекты бэкэнда в QML для каждой отдельной модели камеры? Я не хочу использовать какие-либо переключатели на camInfo.type
в QML.
Было бы предпочтительно, если бы я мог сделать что-то вроде:
Text {
y: 50
x: 50
text: camera.sensor0Data.sensorReading
}
}
, где camera.sensor0Data.sensorReading
каким-то образом "отобразится" на один из apertureData.sensorReading
, sensor0Data.sensorReading
et c. в бэкэнде. И Text
будет visible:false
, если подключенная камера не включает этот указанный c датчик.
Фрагмент 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;
}
}