现在的位置: 首页 > 综合 > 正文

Qt C++程序和qml的交互方法

2014年04月03日 ⁄ 综合 ⁄ 共 1995字 ⁄ 字号 评论关闭

更新:黑莓开发者网站上的文章非常好!!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 <QtDeclarative>
//3.2 qml中可以直接声明使用MyClass类型
    cpp文件:
qmlRegisterType<MyClass>("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

抱歉!评论已关闭.