Добавить/вставить динамически элемент QML в представление QML с помощью С++

Я пытаюсь добавить пользовательский элемент QML, который я создаю, в другое представление QML, уже загруженное из C++.

Контекст следующий: я загружаю представление QML из C++, и мне нужно внедрить другой пользовательский компонент QML, который я встраиваю в это представление QML. Все на С++.

Я искал 4 часа, и я не нашел способ выполнить это.

Вот некоторый код, чтобы дать вам лучшую перспективу:

QmlDocument *qml = QmlDocument::create("asset:///PosicionConsolidad.qml").parent(this);
qml->setContextProperty("pos", this);

Page *page = qml->createRootObject<Page>();
myST = GlobalST::getInstance();
LoadInfo();

_mRoot->push(page);
_app->setScene(_mRoot);

void Project::LoadInfo() {
    QmlDocument *qml = QmlDocument::create("asset:///customComponents/TableRow.qml").parent(this);
    //Here's where I need to append this new QML custom element to the 
    //page previously loaded.
    //I don't know if I can just inject it or I need to make a find child to 
    //maybe a parent container in the QML view and then add it there. But I 
    //also tried that and didn't work out.
}

Пожалуйста помоги. С Уважением.


person mariomunera    schedule 29.10.2012    source источник


Ответы (2)


Вы можете создать Page и корневой контейнер на C++, а затем добавить все остальное из двух файлов QML. Однако на самом деле это заменяет вызов findChild() кодом для создания страницы и контейнера. Наверное, не стоит.

person torpesco    schedule 31.10.2012

Что ж, я, наконец, нашел способ пройти через это, который не совсем чище или красивее всего. Я использовал функцию «Найти дочерний элемент», чтобы получить контейнер, принадлежащий загруженному представлению QML, а затем добавить свой пользовательский компонент QML столько раз, сколько мне нужно.

Некоторый код ниже:

Class::Constuctor(bb::cascades::Application *app,
        NavigationPane* mRoot) :
        QObject(app) {

    _app = app;
    _mRoot = mRoot;

    QmlDocument *qml =
            QmlDocument::create("asset:///PosicionConsolidad.qml").parent(this);
    qml->setContextProperty("pos", this);

    posicionConsolidadaPage = qml->createRootObject<Page>();
    _mRootContainer = posicionConsolidadaPage->findChild<Container*>("posicion_consolidadad");

    LoadInfo();

    _mRoot->push(posicionConsolidadaPage);
    _app->setScene(_mRoot);
}

void Class::LoadInfo() {

        QmlDocument *qml = QmlDocument::create(
                "asset:///customComponents/TableRow.qml").parent(this);
        Container *activesHeader = qml->createRootObject<Container>();

        AbsoluteLayout *pAbsoluteLayout = new AbsoluteLayout();
        activesHeader->setLayout(pAbsoluteLayout);

        AbsoluteLayoutProperties* pProperties = AbsoluteLayoutProperties::create();
        pProperties->setPositionX(0);
        pProperties->setPositionY(155);
        activesHeader->setLayoutProperties(pProperties);

        _mRootContainer->add(activesHeader);
}

Надеюсь, поможет. Если кто-нибудь знает, как добавить новый компонент непосредственно в объект страницы или что-то в этом роде, опубликуйте его :)

person mariomunera    schedule 29.10.2012
comment
Я думаю, что путь, который вы нашли, является правильным путем. Мы никогда не добавляем компонент на страницу, а добавляем в контейнер. - person Benoit; 30.10.2012