5

私はQMLアプリケーション(blackberry 10)に取り組んでおり、次のようなQMLファイルを持っています:

import bb.cascades 1.0    
Page {
        content: Container {
            id: containerID
            Button {
                id: button1
                text: "text"
                onClicked: {
                }
            }
            Label {
                id: label1
                text: "text"
            }
        }
    }

label1今、私は私のC ++コードでにアクセスしたいので、次のコードがあります:

#include "app.hpp"

#include <bb/cascades/Application>
#include <bb/cascades/QmlDocument>
#include <bb/cascades/AbstractPane>

using namespace bb::cascades;

App::App()
{
    QmlDocument *qml = QmlDocument::create("main.qml");
    //-- setContextProperty expose C++ object in QML as an variable
    //-- uncomment next line to introduce 'this' object to QML name space as an 'app' variable
    //qml->setContextProperty("app", this);

    AbstractPane *root = qml->createRootNode<AbstractPane>();

    QObject *labelTest = root->findChild<QObject*>("label1");
    if (labelTest)
        labelTest->setProperty("text", "yes!!");

    Application::setScene(root);
}

アプリを実行しましたが、ラベルのテキストは変わりません。

なにが問題ですか?

4

2 に答える 2

5

答えは自分で見つけました。QML コード:

import bb.cascades 1.0

//-- create one page with a label and text

Page {
    property alias labelText: label.text      
    content: Container {            
        Label {
            id: label
            text: "Label"
        }  

        Button {
            objectName: "button"
            text: "Button"
        }                               
    }
}

および C++ コード:

#include "app.hpp"

#include <bb/cascades/Application>
#include <bb/cascades/QmlDocument>
#include <bb/cascades/AbstractPane>

using namespace bb::cascades;

App::App()
{
    QmlDocument *qml = QmlDocument::create("main.qml");
    //-- setContextProperty expose C++ object in QML as an variable
    //-- uncomment next line to introduce 'this' object to QML name space as an 'app' variable
    //qml->setContextProperty("app", this);

    AbstractPane *root = qml->createRootNode<AbstractPane>();

    root->setProperty("labelText", "yes");

    QObject *newButton = root->findChild<QObject*>("button");
    if (newButton)
        newButton->setProperty("text", "New button text");

    Application::setScene(root);
}
于 2012-09-18T18:18:31.447 に答える
0

別の解決策は...

QML:

import bb.cascades 1.0

//-- create one page with a label and text

Page {
    property alias labelText: label.text      
    content: Container {            
        Label {
            id: label
            text: "Label"
            objectName: "label1"
        }  

        Button {
            objectName: "button"
            text: "Button"
        }                               
    }
}

C++

#include "app.hpp"

#include <bb/cascades/Application>
#include <bb/cascades/QmlDocument>
#include <bb/cascades/AbstractPane>

using namespace bb::cascades;

App::App()
{
    QmlDocument *qml = QmlDocument::create("main.qml");
    //-- setContextProperty expose C++ object in QML as an variable
    //-- uncomment next line to introduce 'this' object to QML name space as an 'app' variable
    //qml->setContextProperty("app", this);

    AbstractPane *root = qml->createRootNode<AbstractPane>();

    QObject *labelTest = root->findChild<QObject*>("label1");
    if (labelTest)
        labelTest->setText(QString("yes!!"));

    Application::setScene(root);
}

しかし、あなたが提示する解決策は多くの点で優れています。

于 2012-09-20T12:47:46.843 に答える