Qt Quick5.2 开发笔记2 -------Qml 和 c++交互的探索

Qml 和 c++的相互交互的问题

这也是我们最关心的问题。

涉及到跟原先系统是否能集成,

这可是涉及系统架构的大问题啊。


百度/Google之后,找到了这个QM_Call_Qt_Function,原帖地址在这里:

http://developer.nokia.com/community/wiki/QML%E4%B8%8EQt_C%2B%2B_%E4%BA%A4%E4%BA%92%E6%9C%BA%E5%88%B6%E6%8E%A2%E8%AE%A8%E4%B8%8E%E6%80%BB%E7%BB%93

当下载下来之后,很悲惨的发现,这个例子根本跑不起来。。。

是今天出门没看黄历?

当然不是!

例子是Qt 4.7,天才的Nokia竟然不向下兼容。怪不得要倒闭,被微软收购。哼!

修改很简单,只要把myclass.h中的 QObject对象改成 QQuickItem,然后按照c++惯例相应的也改掉,搞定。

总结:

1.      Main.cpp注册自定义的类,相应把自定义的对象类登记到qml对象模型中

qmlRegisterType<MyClass>("MyClassPackage",1, 0, "MyClassType");

       第1个,2个是包名字和版本号,qml 通过 Import MyClassPackage 1.0引入

       第3个 qml中对象名字。例如:

Qml中

MyClassType
{
       id:myclass
}
    Button{
       id:btn1
       anchors{
           horizontalCenter:parent.horizontalCenter
           top:label.bottom
           topMargin:10
       }
       text:qsTr("PROPERTY")
       onClicked:label.text="myclass:"+myclass.myString;
}


C++中的声明

Q_PROPERTYQString myString READ myString WRITE setmyString NOTIFY myStringChanged)

此时即可访问myclass的属性。

当然myclass,也会默认生成 onMyStringChanged的默认信号。

另外也可以定义自定义的消息,在qml中按需响应。

C++中

signals:

void myStringChanged();

void mySignals(QString str);

qml中

    Connections
    {
       target:myclass
       onMyStringChanged:{
        }
       onMySignals:{
       }
    }


2.      qml 调用c++,需要在该函数前面加入:Q_INVOKABLE

C++中

  Q_INVOKABLE int testDll(int a, int b);
    Q_INVOKABLE int testLoadDll(int a, int b);
    Q_INVOKABLE int testStaticLib(int a, int b);
Qml中的调用
 
 
        Button{
            id:btnT3
            text:qsTr("myclass.testDll")
            onClicked:{
                label.text=myclass.testDll(123,456);
            }
 
        }
 
        Button{
            id:btnT4
            text:qsTr("MyClass::testStaticLib")
            onClicked:{
                label.text=myclass.testStaticLib(11,123);
            }
        }


真是高端大气上档次!

猜你喜欢

转载自blog.csdn.net/hellowithsmile/article/details/20737371