Как безошибочно представить объекты C ++ в QML для различных setContextProperties? - PullRequest
0 голосов
/ 08 марта 2020

Я создаю приложение 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;
    }
}
...