Qt C++プログラムとqmlのインタラクション方法

2673 ワード

更新:ブラックベリー開発者のウェブサイトの文章はとても良いです!!C++ and QML integration
================================================================
次のコードはQt creatorでテストされました.
================================================================
//方法1://1.1 setContextProperty()で既存のQt C++オブジェクトをQMLに暴露する
//1.2 qmlではmyobjectExposeByCxPropertyオブジェクトを直接使用できます
cppファイル:
MyClass myObj;
    myObj.setmyString("Hello World");
    
    QDeclarativeEngine *engine=viewer.engine();
    QDeclarativeContext *context=engine->rootContext();
    context->setContextProperty("myObjectExposeByCXProperty", &myObj);
qmlファイル:
onClicked: label.text=myObjectExposeByCXProperty.myString;
    
注意:BlackBerry 10 Cascadesでは、context propertyを設定する方法が少し異なります.
QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
setContextProperty("myObjectExposeByCXProperty", &myObj);
クラスのメソッドはQ_と宣言する必要がありますINVOKABLEの、例えばヘッダファイルに次のように宣言してこそ、qmlでこのクラスのplay()メソッドを呼び出すことができます.
Q_INVOKABLE void play();
================================================================
//方法2:
//2.1 setContextProperty()により既存のQt C++オブジェクトをQMLに暴露する
///2.2 qml cppプログラムからの信号を受け取る
cppファイル:
MyClass myObj;
    myObj.setmyString("Hello World");
    
    QDeclarativeEngine *engine=viewer.engine();
    QDeclarativeContext *context=engine->rootContext();
    context->setContextProperty("myObjectExposeByCXProperty", &myObj);
qmlファイル:
    Connections
    {
        target: myObjectExposeByCXProperty
        onMyStringChanged:label.text=「こんにちは!Signal handler received,thanks man」
    }
================================================================
//方法3:登録タイプ
//3.1注意main.cpp需要#include
//3.2 qmlではMyClassタイプの使用を直接宣言できます
cppファイル:
qmlRegisterType("RegisterMyType", 1, 0, "MyClassType");
qmlファイル:
import RegisterMyType 1.0
onClicked: myclassExposeByRegType.setmyString("xxx");
               label.text=myclassExposeByRegType.myString;
    MyClassType
    {
        id:myclassExposeByRegType
    }
ヒント:BlackBerry公式の一例、省略..
To use Phone APIs in QML, register the classes in your main.cpp file:
qmlRegisterType<bb::system::phone::Phone>("bb.system.phone", 1, 0, "Phone");
bb::data::DataSource::registerQmlTypes();

http://developer.blackberry.com/cascades/documentation/device_comm/phone/index.html