0

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

由于我目前使用的方法,我必须检查在 QML 中连接了哪种相机(camInfo.type),并根据它绑定到适当的后端对象。这在我的整个 QML 应用程序中都使用过,因此完成了很多 switch-casing,并且支持新的相机模型非常难以维护。

对于每个不同的相机型号,是否有另一种方法可以将不同的后端对象公开给 QML?我不想camInfo.type在 QML 中使用任何 switch-cases。

如果我能做类似的事情会更好:

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

在哪里camera.sensor0Data.sensorReading会以某种方式“映射”到后端中的一个apertureData.sensorReadingsensor0Data.sensorReading等等。如果连接的相机Textvisible: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;
    }
}
4

1 回答 1

0

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

制作一个像

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

哪里SensorsModel可以简单地QAbstractListModel暴露一堆 Sensor 对象,比如 say Sensor { type: "battery"; minValue: 0; maxValue: 100; value: 50}.

然后在 QML 中,您可以Loader根据相机类型加载各种视图。

于 2020-10-06T16:03:13.963 回答