主要内容:
1. Loader中的signal信号交互;
2. Loader中的property属性交互;
看如下代码:
//LoadedModule.qml
import QtQuick 2.0 Rectangle { id:root; width: 200; height: 100; color: "blue"; property string content: qsTr("This is a Rectangle Item"); signal mouseClicked(); MouseArea { anchors.fill: parent property bool oldState: true; onClicked: { parent.color = oldState ? 'red' :"blue"; oldState = !oldState; root.mouseClicked(); } } onContentChanged: { console.log("property <content> has changed"); console.log(root.content); } }
作为被动态载入的模块,定义了一个信号 mouseClicked(),并且自定义了一个property -> string content 初始值为" This is a Rectangle Item";并在信号处理器
onContentChanged中打印出属性变化和更改后的字符串。下面再看main.qml:
import QtQuick.Window 2.0
import QtQuick.Controls 2.0
//
//处理Loader -> source 中的 signal 和property问题
//
Window{
id:rootWin;
width: 400;
height: 540;
visible: true;
Loader{
id:modLoader;
source: "qrc:/LoadedModule.qml";
onLoaded: {
//直接通过signal.connect方法连接
modLoader.item.mouseClicked.connect(on_Mouse_Clicked);
console.log(modLoader.item.content);
/* 修改content */
modLoader.item.content = qsTr("modify property < content >");
}
}
function on_Mouse_Clicked(){
console.log("on_Mouse_Clicked");
}
}定义了一个Loader -> id : modLoader,设置source为LoadedModule.qml。并在onLoaded中处理信号与属性交互。由于在QML中signal 也是对象,因此具有connect方法。
可以直接使用connect连接到处理函数,在上述代码中定义处理函数为 on_Mouse_Clicked() ,简单进行一个打印输出。从代码中可以看出,信号与属性的交互均是通过Loader的item实现的。
item是Loader的属性,它拥有被载入模块的最顶层(top-level)的对象(object),在此例中就是LoadedModule.qml中的Rectangle : root。如果signal和property不是定义在
top-level。那么Loader 是访问不到的。程序运行后输出如下:
QML debugging is enabled. Only use this in a safe environment.
qml: This is a Rectangle Item
qml: property <content> has changed
qml: modify property < content >
qml: on_Mouse_Clicked
qml: on_Mouse_Clicked
qml: on_Mouse_Clicked