QML <11> C++ 和QML 的交互

QML <11> C++ 和QML 的交互

前言

今天又重新看了下QML 和c++ 交互,记个笔记。。
原文:
QML <11> C++ 和QML 的交互_第1张图片

一、QML 中访问C++

1 c++类 为QObject 子类

C++ 类型定义可参考之前的文章:
QML < 5 > QML 访问C++ 类 (函数Q_INVOKABLE、枚举Q_ENUMS 、成员变量Q_PROPERTY、自定义结构体(QVariantMap )、List数据QVariantList 、信号signal 、槽slot)

2 C++类 注册到QML

QML <11> C++ 和QML 的交互_第2张图片

二、C++中访问QML

1 QML对象获得

QQmlComponent、QQuickView( QWindow派生类 ) 可以加载QML 文件

 import QtQuick 2.0

 Item {
     width: 100; height: 100
 }

使用QQmlComponent 需要调用QQmlComponent::create() 创建一个新的 qml文件实例

 // Using QQmlComponent
 QQmlEngine engine;
 QQmlComponent component(&engine,
         QUrl::fromLocalFile("MyItem.qml"));
 QObject *object = component.create();
 ...
 delete object;

QQuickView 自定创建qml文件实例,可通过 QQuickView::rootObject() 访问

// Using QQuickView
 QQuickView view;
 view.setSource(QUrl::fromLocalFile("MyItem.qml"));
 view.show();
 QObject *object = view.rootObject();

获得qml对象后 可通过 QObject::setProperty() 或者 QQmlProperty::write() 修改属性,

object->setProperty("width", 500);
 QQmlProperty(object, "width").write(500);

区别在于 QQmlProperty::write()后解除属性绑定,
例 QML中 width :wgt_width
QObject::setProperty() 后修改wgt_width ,width 值会更新,而 QQmlProperty::write() 后修改wgt_width ,width 值不变

2 QML 对象操作
a 方法调用 QMetaObject::invokeMethod()

访问QML中的方法 QMetaObject::invokeMethod()
Q_RETURN_ARG() 和 Q_ARG() 为QVariant 类型


QML
 // MyItem.qml
 import QtQuick 2.0

 Item {
     function myQmlFunction(msg) {
         console.log("Got message:", msg)
         return "some return value"
     }
 }
C++
 // main.cpp
 QQmlEngine engine;
 QQmlComponent component(&engine, "MyItem.qml");
 QObject *object = component.create();

 QVariant returnedValue;
 QVariant msg = "Hello from C++";
 QMetaObject::invokeMethod(object, "myQmlFunction",
         Q_RETURN_ARG(QVariant, returnedValue),
         Q_ARG(QVariant, msg));

 qDebug() << "QML function returned:" << returnedValue.toString();
 delete object;

b 信号连接QObject::connect()
MyClass myClass;
     QObject::connect(item, SIGNAL(qmlSignal(QString)),
                      &myClass, SLOT(cppSlot(QString)));
c 通过名词访问QML 对象 QObject::objectName QObject::findChild()

QObject::findChildren() 可以找到所有匹配的objectName 对象

 import QtQuick 2.0

 Item {
     width: 100; height: 100

     Rectangle {
         anchors.fill: parent
         objectName: "rect"
     }
 }
 QObject *rect = object->findChild("rect");
 if (rect)
     rect->setProperty("color", "red");

你可能感兴趣的:(QML,javascript,前端,c++)