Как вызвать функцию C++ из qml и изменить текст метки

Я новичок в разработке Blackberry 10. Я создал простой проект BB 10 каскадов. Я хочу изменить текст метки через функцию C++.

main.qml

      import bb.cascades 1.0    
      Page {
         content: Container {
         id: containerID
         Button {
            id: button1
            objectName: "button"
            text: "text"
            onClicked: {
                btnClicked("New Label Text");
            }
        }
        Label {
            id: label1
            objectName: "label1"
            text: "Old Label Text"
        }
    }
}

Теперь, в каком файле я должен объявить и в каком файле я должен определить функцию btnClicked(QString).

HelloBB.hpp

// Default empty project template
#ifndef HelloBB_HPP_
#define HelloBB_HPP_

#include <QObject>

namespace bb { namespace cascades { class Application; }}

class HelloBB : public QObject
{
    Q_OBJECT
    public:
    HelloBB(bb::cascades::Application *app);

    virtual ~HelloBB() {}

};

#endif

HelloBB.cpp

// Default empty project template
#include "HelloBB.hpp"
#include <bb/cascades/Application>
#include <bb/cascades/QmlDocument>
#include <bb/cascades/AbstractPane>

using namespace bb::cascades;
HelloBB::HelloBB(bb::cascades::Application *app) : QObject(app)
{
    // create scene document from main.qml asset
    //set parent to created document to ensure it exists for the whole application lifetime
    QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);

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

    // create root object for the UI
    AbstractPane *root = qml->createRootObject<AbstractPane>();

    // set created root object as a scene
    app->setScene(root);
}

Теперь я хочу изменить текст метки со старого текста метки на текст, заданный пользователем. Я вызываю функцию C++ из qml. Я не знаю, где определить эту функцию и как подключить эту функцию C++ из qml.

Благодарю.

2 ответа

Решение

Вы можете найти документацию по интеграции C++ и QML здесь: http://developer.blackberry.com/cascades/documentation/dev/integrating_cpp_qml/

Как примечания утеса:

В своем конструкторе HelloBB вы можете представить класс QML следующим образом:

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

А затем создайте метод в C++, который вы сможете вызывать из QML. Помните, что метод должен быть помечен как Q_INVOKABLE для вызова из QML.

Учти это:

В HelloBB.hpp:

    public:
           Q_INVOKABLE void test();

В HelloBB.cpp:

    void HelloBB::test() {
        qDebug() << "TEST";
    }

В main.qml:

   onClicked: {
       HelloBB.test ()
   }

Найти ярлык через C++, который вы можете использовать:

Label* yourL = root->findChild<Label*>(LabelObjName); yourL->SetText("my new beautiful text);

не забудьте добавить:

#include <bb/cascades/Button>

и использовать root в качестве закрытой переменной в вашем классе, чтобы вы могли получить доступ к объекту и в других методах

bb::cascades::AbstractPane *root;

С уважением

Другие вопросы по тегам