您的位置:首页 > 编程语言 > Qt开发

Qt QML信号解析

2015-06-19 14:52 579 查看

转载自:http://www.tuicool.com/articles/FfUFZj 其中的信号解析部分

信号(Signal Attributes)

信号属性定义语法:
signal <signalName>[([<type> <parameter name>[, ...]])]
[]
表示可选例如:
//不带参数和括号
signal mySignal

//带空括号
signal mySignal2()

//signal 信号名(参数类型 参数名, 参数a类型 参数a)
signal mySignal3(string name, var any)
对应的signal handler的语法格式则是:
on<SignalName>
如上例中的 mySignal ,对应的signal handler 就写成 onMySignal注意: mySignal的第一个字母S成了大写的了。因为这里onMySignal, on 作为开头了。所以按照QML的语法,mySignal中的 m 就要写成 M , signal 还可以以下划线 _ 开头,比如_mySignal4 ,对应的signal handler则写成 on_MySignal4 ,下划线的数目也可以不同。再比如 __mySignal4 和_mySignal4**就是两个不同的signal(前者一个下划线,后者两个下划线)signal mySignal3的 signal handler:
onMySignal3: {
console.debug("i'm a signal handler")
console.debug("name"en);
}
QML有内建的属性signal,当属性的value变化的时候,就会emitted signal. 这个就是文档中所说的 Property Changed Signal
import QtQuick 2.0

Item {
width: 100; height: 100

MouseArea {
anchors.fill: parent
onClicked: {
console.log("Click!")
}
}
}
MouseArea有 clicked signal, 当鼠标点击MouseArea 的时候,就会emit clicked signal。 signal handler onClicked 就会触发,console 就会打印出“Click!“Signal Handler 是一种特殊的 method 属性。当你在QML中文件中声明一个singal的时候,QML会自动帮你关联一个signal handler,这个signal handler默认是没有实现的。所以你只需要实现这个signal handler就可以了,然后在emitted一个signal的时候,与之关联的signal handler就会自动的被QML引擎调用。例如文档中的一个例子:
// SquareButton.qml
Rectangle {
id: root

signal activated(real xPosition, real yPosition)
signal deactivated //注意我没有括号哦!

width: 100; height: 100

MouseArea {
anchors.fill: parent
onPressed: root.activated(mouse.x, mouse.y) //emit activated signal and parameter
onRelased: root.deactivated() //emit deactivated signal 注意我有括号哦!
}
}

// myapplication.qml
SquareButton {
//implement onActivated signal
onActivated: console.log("Activated at " + xPosition + "," + yPosition)
//implement onDeactivated signal
onDeactivated: console.log("Deactivated!")
}
在SquareButton.qml中的MouseArea,pressed、released都emitted了一个signal。 由此可以看出QML中emitted一个signal,你只需要调用它就行了。注意: 在QML中声明无参signal你可以不带括号,但是emitted它的时候,就必须要带括号了。否则,它不会报错,但是它也不会emitted signal而在Qt C++代码中你要想emittd一个signal,你就必须使用emit <定义的信号>,才能够emit一个signal。在myapplication.qml中你使用SquareButton这个自定义的Component时,只需实现下onActivated、onDeactivated这两个signal handler就行,因为QML已经帮你declare并connected了。signal 不仅有 signal handler ,它还可以与后面讲到的method连接(connect),Qt 一个很重要的机制就是信号和槽机制,其实在QML中也有这个,只是叫法不一样而已。QML中所有的method都是slot。

Property Change Signal Handlers

语法格式:
on<Property>Changed
signal 有signal handler,property呢? property有property changed signal handler(属性变化信号处理方法,呵呵有点拗口,翻译水平不行,不纠结在这种意会的层次,能够理解就行),既然也是signal hanlder那就不需要你去declare它并关联到信号了。你也只需要使用它就行了。例文档中的:
import QtQuick 2.0

TextInput {
text: "Change this!"
onTextChanged: console.log("Text has changed to:", text)
}
[/code]
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: