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
Qt 设置多个qml文件的上下文属性_Qt_Qml - Fatal编程技术网

Qt 设置多个qml文件的上下文属性

Qt 设置多个qml文件的上下文属性,qt,qml,Qt,Qml,我有一个main.qml,里面有两个横幅(标题栏和底部横幅),如下所示 Window { id: main visible: true Image { source: "qrc:/banner.png" anchors.fill: parent } TitleBanner { x:0 y:10 } BottomBanner { x:0 y:

我有一个main.qml,里面有两个横幅(标题栏和底部横幅),如下所示

Window {
    id: main
    visible: true

    Image {
        source: "qrc:/banner.png"
        anchors.fill: parent
    }

    TitleBanner {
        x:0
        y:10
    }

    BottomBanner {
        x:0
        y:420
    }
}
在TitleBanner.qml中,我有以下代码

Item {
    Rectangle {
        id : id_title_banner

        property real value : titlebanner.title

        Image {
            source: "qrc:/banner_title.png";
        }

        //todo:: some animation stuffs on 'value' later
    }
}
Item {
    Rectangle {
        id : id_bottom_banner

        property real value : bottombanner.title

        Image {
            source: "qrc:/banner_bottom.png";
        }

        //todo:: some animation stuffs on 'value' later
    }
}
在BottomBanner.qml中,我有以下代码

Item {
    Rectangle {
        id : id_title_banner

        property real value : titlebanner.title

        Image {
            source: "qrc:/banner_title.png";
        }

        //todo:: some animation stuffs on 'value' later
    }
}
Item {
    Rectangle {
        id : id_bottom_banner

        property real value : bottombanner.title

        Image {
            source: "qrc:/banner_bottom.png";
        }

        //todo:: some animation stuffs on 'value' later
    }
}
<>在C++侧,我为标题横幅和底部横幅保留两个独立的对象(以后的灵活性)。我设置根上下文属性将标题横幅对象从C++到QML公开为

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

   //create title banner object
   CTitleBanner *objTitleBanner = new CTitleBanner();

   //create bottom banner object
   CBottomBanner *objBottomBanner = new CBottomBanner();

   QQmlApplicationEngine engine;
   engine.rootContext()->setContextProperty("titlebanner", objTitleBanner);

   engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

   return app.exec();
}

我的问题是,我们如何分别为titlebanner和bottombanner qml文件设置上下文属性,而不是将其设置为根上下文?我担心的是,如果以后有更多的横幅出现,我会将其设置为rootContext。这是正确的做法吗?我们如何为每个横幅创建单独的上下文?

您的假设:


它将替换上面的上下文属性

这是错误的:

// in main.cpp
QObject* obj1 = new QObject();
QObject* obj2 = new QObject();

engine.rootContext()->setContextProperty("obj1", obj1);
engine.rootContext()->setContextProperty("obj2", obj2);

qDebug() << "obj1" << obj1 << engine.rootContext()->contextProperty("obj1").value<QObject*>();
qDebug() << "obj2" << obj2 << engine.rootContext()->contextProperty("obj2").value<QObject*>();

两个对象都在那里,具有正确的标识符



就我个人而言,我不喜欢
contextProperties
,因为它们很容易被e.t.c.跟踪。我宁愿将我的CPP模型注册为单例,这样我就可以在我真正想要访问它们的地方导入它们。尽管单身人士也有缺点。(例如,
qmlscene
将无法导入它们)

“它将替换上面的上下文属性。”是吗?我不想尝试。如果是的话。为什么不创建一个
QObject contextData
,它有两个属性:
titlebanner
bottombanner
,您将其设置为两个原始banner对象(可能是巧合?)。然而,我认为我最初的问题的答案应该是“否”。@derM,对不起,我的问题中有一个更正,我已经编辑了相同的问题。对你的观点是正确的,它不会取代我之前尝试过的上下文。请看我编辑的问题。我不明白你的新问题。会有多少横幅?C++会对这个有什么影响?由于QML更加灵活,您应该努力保持C++部分尽可能不变。在C++中创建一个稳定的数据模型,只在QML中实现视觉表示的魔力。如果需要数据库访问,您可以在C++中创建某种内容模型。C++部分不应该知道视图中的内容。@ DRM,在上面的例子中,我为根上下文设置了CONTROW属性。因此,我可以从所有qml文件访问banner对象。例如,在BottomBanner.qml文件中,我还可以访问“objTitleBanner”。我在想这是一种更可取的方式吗?。稍后,我计划添加更多的横幅(比如说大约20个横幅)。最后,我们可以从任何qml文件访问所有banner对象。我不知道这是qt的开销。是这样吗?所以我想我们可以为qml文件设置一个特定的上下文。例如,在TitleBanner.qml中,我只能访问“objTitleBanner”。设置上下文属性实际上只是将属性设置为qml对象树的根。这意味着,QML将遵循常规的名称解析算法(查找当前范围、查找文件根范围、查找实例化该文件e.t.c的文件的根范围,直到它到达根上下文-或失败)。在一个范围内,查找应该是快速的,因为它是(afaik)作为某种映射实现的。与尝试从深度嵌套的对象访问它相比,拥有20个上下文属性并不是一个问题。您的意思是向qmlRegisterType注册您的模型并使用模型中的setProperty来设置qml属性?我还计划用这个解决方案替换上下文属性。在我的例子中,我更喜欢调用我的自定义类作为控制器,并将其注册到qmlRegisterType,并从自定义控制器类设置正确的属性。我有另一个与控制器类关联的模型类。No。我的意思是在
qmlRegisterSingleton
中注册它,如果对象的性质确实是[在一个进程中]的singleton。如果不是,我会将其注册为可实例化类型(
qmlRegisterType
),但我也会在QML中创建实例(例如
mysubviewsspecificnonsingletonmodel{}
)-这些方法的缺点是,很难模拟它们进行测试,例如,使用C++代码意味着,C++的部分需要对QML结构有深刻的了解,你会避免,因为你会失去灵活性。更改视图也意味着更改模型。使用
setContextProperty
意味着您需要遵守命名约定,以避免名称的阴影。这可能是第三方代码或同事的问题。“但是,使用C++的StEtfess意味着,C++部分需要对QML结构有深刻的了解,是的。我同意。但是,我理解这会给C++和QT之间带来更多的解耦。我指的是链接。你建议在QT和C++之间提供更多的解耦逻辑的解决方案?他所做的就是实例化QML中的一个对象。他对
组件的风格很差。未完成的{…}
东西。他应该公开一个属性,您可以将该对象绑定到该属性,但在内部它将调用
setMyObject
-所以。。。好剩下的没问题。与<>代码> QtQuq.For 2 .x/Cux>中的内容类似:您定义C++中控件的行为素材,将代码表示通过代码> > CistaTimes等> /Cuff>属性到C++端。但是大多数部分都是通过向QML提供属性来完成的,设计者可以选择绑定到QML,而不是在项中主动重写。