Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何干净地暴露C++;后端对象到QML,用于不同的setContextProperties? 我正在用C++后端创建QML应用程序。不同类型的相机可以连接到我的C++后端。这些相机有不同类型的传感器和不同的电池数量等。根据相机的类型,C++后端使用 SETCONTXEXPRESS()< < /C> >将对象暴露给QML。_C++_Qt_Qml_Qt5_Qqmlapplicationengine - Fatal编程技术网

如何干净地暴露C++;后端对象到QML,用于不同的setContextProperties? 我正在用C++后端创建QML应用程序。不同类型的相机可以连接到我的C++后端。这些相机有不同类型的传感器和不同的电池数量等。根据相机的类型,C++后端使用 SETCONTXEXPRESS()< < /C> >将对象暴露给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:

由于我当前使用的方法,我必须检查QML中连接了什么类型的摄像头(
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使用加载器加载各种视图的想法似乎是向前推进的方法。你能把你的建议作为这个帖子的答案吗?