我有一个main.qml,里面有两个横幅(titlebanner和bottombanner),如下所示。
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
}
}
在BottomBanner.qml中,我有以下代码
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文件设置context属性,而不是将其设置为root上下文?我关注的是,如果有更多的横幅,我将它设置为rootContext。这是一种正确的做法吗?我们如何为每个横幅创建单独的上下文?
答案 0 :(得分:1)
你的假设:
它取代了上面的上下文属性。
错了:
// 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*>();
// in main.qml
Component.onCompleted: console.log(obj1, obj2)
// output:
obj1 QObject(0x22d8c768) QObject(0x22d8c768)
obj2 QObject(0x22d8c778) QObject(0x22d8c778)
qml: QObject(0x22d8c768) QObject(0x22d8c778)
两个对象都在那里,并带有正确的标识符。
个人我不喜欢contextProperties
,因为它们很容易受到影响e.t.c. - 我宁愿将我的CPP模型注册为单身人士,因此我可以在我真正想要访问它们的地方导入它们。虽然这些单身人士有缺点。 (例如qmlscene
无法导入它们)