强烈的希望是人生中比任何欢乐更大的兴奋剂。——尼采
上一篇文章讲了QML引擎加载qml文件的过程,大体过程是,解析qml文件,然后为文件中的每个元素创建对应的c++对象。例如,qml文件中如果使用了Text类型,引擎会创建对应的QQuickText类的实例。
qml文件被引擎加载之后,在运行阶段,QML引擎并没有很多地参与, 事件处理和场景绘制是由C++类完成的。例如,qml的中的TextInput控件类型对应的c++类是QQuickTextInput,该控件的输入事件由QQuickTextInput::keyPressEvent() 处理,绘制由QQuickTextInput::updatePaintNode()处理,QML引擎并没有再参与。
在运行阶段,QML引擎仍然参与了两个事情: Bound signal handlers 和 property binding updates。例如,MouseArea控件的onClicked信号会与一个处理函数对应起来,这就是Bound signal handlers.
import QtQuick 2.0
Rectangle {
width: 300
height: 300
color: "lightsteelblue"
Text {
anchors.centerIn: parent
text: "Window Area: " + (parent.width * parent.height)
}
}
如上所示例子,它涵盖了两种类型的属性绑定:
1)简单的属性赋值(Simple value assignments)。 例如,QQuickRectangle的width属性被赋值为300. 这个赋值动作对应的VME instruction是 STORE_DOUBLE, 该指令会在创建c++对象时被执行,VME会调用QMetaObject::metacall(QMetaObject::WriteProperty, …),该函数最终调用QQuickRectangle::setWidth(). 设置完成后,QML引擎就不会在更改这个width属性值了。
2)属性绑定(Binding assignments)。 例如,上例中的,Text的text属性与其parent的