Каскады BlackBerry10: невозможно получить доступ к объектам управления из QML в С++

В моем проекте у меня есть два файла qml, а именно. main.qml и DetailsPage.qml.

Я пытаюсь изменить текст метки DetailsPage.qml из С++, используя метод findChild().

Это код в файле С++ и DetailsPage.qml

Код Myfile.cpp:

using namespace bb::cascades;

AbstractPane *root;

AbstractPane *root1;

 Navigater::Navigater

(bb::cascades::Application *app):QObject(app)

{

  QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);

   QmlDocument *qml1 = QmlDocument::create("asset:///DetailsPage.qml").parent(this);

    qml->setContextProperty("_app", this);

    qml1->setContextProperty("_app", this);

    root = qml->createRootObject<AbstractPane>();

    root1 = qml1->createRootObject<AbstractPane>();

    app->setScene(root);

}

void Navigater::tr1()

{

Label *tryLabel1 = root1->findChild<Label*>("labelObj");

if(tryLabel1)

{

qDebug()<<"tttt "<<tryLabel1->text();               //initial text

tryLabel1->setText("Hello!!!!!!!") ;

qDebug()<<"yyyy "<<tryLabel1->text();  //changedText gets reflected on DeviceLog but not on UI   
}   
else

{

qDebug()<<"Not Found";}

}

Код DetailsPage.qml:

// Navigation pane project template

import

 bb.cascades 1.0

Page

 {

   // page with a picture detail

   id: pgDetail


actions: [

  ActionItem {

     title: qsTr("Break")

          onTriggered: {

                 _app.tr1();

                imgView.imageSource = "asset:  //images/picture1br.png"

            }

        }

    ]


paneProperties: NavigationPaneProperties {


backButton: ActionItem {


onTriggered: {                

                navigationPane.pop()

            }

        }

    }


onCreationCompleted: {

        _app.tr1();

    }

   Container {


background: Color.Black


Label {


objectName: "labelObj"    // control to be found


text: "Page 2"


horizontalAlignment: HorizontalAlignment.Center               


textStyle {    


base: SystemDefaults.TextStyles.TitleText


color: Color.Yellow

                      }

        }


ImageView {


id: imgView


imageSource: "asset:///images/picture1.png"    


horizontalAlignment: HorizontalAlignment.Center

        }          

Label {


text: qsTr("Picture description")    


horizontalAlignment: HorizontalAlignment.Center

        }

    }

}

Сделанное мной изменение не отражается в симуляторе... но отображается в журнале устройства.

Есть ли способ получить доступ к объектам управления с нескольких страниц, т.е. страниц, отличных от main.qml?

Не могли бы вы взглянуть на это.


person user2474648    schedule 11.06.2013    source источник
comment
Если вы установите app-›setScene(root); вместо root1. DetailsPage.qml не отображается. Поэтому никаких изменений в нем не видно. Верно?   -  person Benoit    schedule 12.06.2013
comment
Я бы предположил, что страница отображается каким-то другим способом, в точке, не отображаемой в его примере кода. setScene — не единственный способ вызвать QML на экран.   -  person TheSmurf    schedule 18.06.2013
comment
В этом случае код, вызывающий его, может быть вставлен. это помогло бы помочь   -  person Benoit    schedule 26.06.2013


Ответы (2)


Вы можете использовать панель навигации, добавить main.qml в качестве содержимого страницы и страницы сведений в качестве прикрепленных объектов в панели навигации, например

attachedObjects: [
                    ComponentDefinition {
                        id: secondPageDefinition
                        source: "DetailsPage.qml"
                    }

в действии на главной странице добавить

 onClicked: {
                    // show detail page when the button is clicked
                    var page = secondPageDefinition.createObject();
                     navigationPane.push(page);
                }

Я думаю, это решит вашу проблему, и на странице main.cpp измените содержимое следующим образом.

QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);

qml->setContextProperty("_app", this);

root = qml->createRootObject<AbstractPane>();

app->setScene(root);

а также

void Navigater::tr1()

{

Label *tryLabel1 = root ->findChild<Label*>("labelObj");

if(tryLabel1)

{

qDebug()<<"tttt "<<tryLabel1->text();               /////////////intial text

tryLabel1->setText("Hello!!!!!!!") ;

qDebug()<<"yyyy "<<tryLabel1->text();  ////////////changedText gets reflected on DeviceLog but not on UI

}

else

{

qDebug()<<"Not Found";}

}
person pranavjayadev    schedule 10.07.2013

вы можете легко перемещаться в qml без использования С++


1.page1.qml

Page {
    id: rootPage
    Container {
        background: Color.LightGray

        layout: DockLayout {

        }
        Label {
            text: "First page"
            horizontalAlignment: HorizontalAlignment.Center
            verticalAlignment: VerticalAlignment.Center
        }
    }

actions: [
        ActionItem {
            title: "Next page"
            ActionBar.placement: ActionBarPlacement.OnBar
            onTriggered: {
                var page = pageDefinition.createObject();
                navigationPane.push(page);

            }

            attachedObjects: ComponentDefinition {
                id: pageDefinition
                source: "PageTwo.qml"
            }
        }
    ]
}
onPopTransitionEnded: {
    page.destroy();
}

person Rajesh Loganathan    schedule 04.09.2013