标签(空格分隔): Qt
自定义信号与使用
如果你自己定义新的QML类型,可以使用signal关键字给你的类型添加信号。其语法如下:
signal <name> [(<type><parameter name>[,...])]
这是你的类型通告自己状态的最好方式,符合Qt的风格。
信号其实是个方法(函数),所以,它的发射实际上是通过调用以信号名为名的方法达成的。举个实际的例子:我们在界面上放一个字符串,两个代表颜色的小方块,点小方块,字符串的颜色就变成小方块的颜色。代码如下:
import QtQuick 2.0
Rectangle {
width: 320;
height: 240;
color: "#C0C0C0";
Text {
id:coloredText;
anchors.horizontalCenter: parent.horizontalCenter;
anchors.top:parent.top;
anchors.topMargin: 4;
text:"Hello World !";
font.pixelSize: 32;
}
Component {
id: colorComponent;
Rectangle {
id: colorPicker;
width: 50;
height: 30;
signal colorPicked(color clr);
MouseArea {
anchors.fill: parent;
onPressed: colorPicker.colorPicked(colorPicker.color);
}
}
}
Loader {
id: redLoader;
anchors.left: parent.left;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
sourceComponent: colorComponent;
onLoaded: {
item.color ="red";
}
}
Loader {
id: blueLoader;
anchors.left: redLoader.right;
anchors.leftMargin: 4;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 4;
sourceComponent: colorComponent;
onLoaded: {
item.color ="blue";
}
}
Connections {
target: redLoader.item;
onColorPicked:{
coloredText.color = clr;
}
}
Connections {
target: blueLoader.item;
onColorPicked :{
coloredText.color = clr;
}
}
}
首先定义了一个Text对象,id为coloredText,后面会根据这个id来改变它的颜色。
然后,定义了一个组件,组件内有一个Rectangle对象,这里是我们定义信号的地方。我们设置了Rectangle的尺寸,然后定义了信号colorPicked,语句如下
signal colorPicked(color clr)
;
为了触发信号,给Rectangle引入了MouseArea。MouseArea是专门处理鼠标操作的Item,这里我们先知道它有一个pressed信号就行了。我们给这个信号指定信号处理器onPressed,在信号处理器中我们调用我们刚定义的信号:colorPicker.colorPicked(colorPicker.color);信号的触发就是一个函数的调用。
组件是可以重复利用的,一个组件可以在单独的QML文件中定义,也可以嵌入到其他QML文档中来定义以方便简单组件的使用。这里是在主QML文档内嵌入组件的定义,定义好了组件,就可以使用Loader来加载组件了。(Loader与component对应)
Loader是专门用来动态创建组件的,它可以从QML文件中创建组件,也可以指定sourceComponent来创建,这里是组件嵌入在主QML文件中定义的,所以使用了sourceComponent方式。我们给每个Loader一个id,以便后面连接时使用。还使用anchors为Loader布局,最后,在Loader的onLoader信号处理器内给Rectangle对象配置颜色。
创建完Loader,就是建立连接了。这里使用Connections 来建立信号的连接,target指向刚才说的Loader对象的 item属性,item属性实际上指向Loader创建的对象。在Connections对象中,通过onColorPicked信号处理器响应用户点击操作。
具体效果
![](https://img.haomeiwen.com/i5363773/7cc2a3fd6b7d7b93.gif)
网友评论