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:
http://developer.blackberry.com/cascades/documentation/device_comm/phone/index.html
================================================================
次のコードは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
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