C++ バックエンドで QML アプリケーションを作成しています。さまざまな種類のカメラを C++ バックエンドに接続できます。これらのカメラには、さまざまな種類のセンサーとさまざまな数のバッテリーなどがあります。接続されているカメラの種類に応じて、C++ バックエンドは を使用してオブジェクトを QML に公開しますsetContextProperty()
。
現在使用している方法では、QML で接続されているカメラの種類 ( camInfo.type
) を確認し、それに応じて適切なバックエンド オブジェクトにバインドする必要があります。これは私の QML アプリケーション全体で使用されているため、多くのスイッチ ケーシングが行われ、新しいカメラ モデルをサポートすることは非常に困難です。
異なるカメラ モデルごとに、さまざまなバックエンド オブジェクトを QML に公開する別の方法はありますか? camInfo.type
QMLでスイッチケースを使用したくありません。
次のようなことができれば望ましいでしょう:
Text {
y: 50
x: 50
text: camera.sensor0Data.sensorReading
}
}
whereは、バックエンドの などのいずれcamera.sensor0Data.sensorReading
かにどういうわけか「マップ」します。そして、接続されたカメラにその特定のセンサーが含まれていない場合です。apertureData.sensorReading
sensor0Data.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
}
}
}
backend.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;
}
}