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

时间:2018-03-21 09:39:37

标签: qt qml

我有一个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。这是一种正确的做法吗?我们如何为每个横幅创建单独的上下文?

1 个答案:

答案 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无法导入它们)