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>Changedsignal 有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]
相关文章推荐
- QTP中参数迭代设置
- Qt 为何没有提供 Sleep
- qt中的sleep
- qt IP控件的实现
- QTP中DataTable类型参数化步骤举例
- pyQT指定窗口截图
- QT:在QTableView中使用各种自定义委托
- QtPropertyBrowser+vs2010的安装与配置
- QtPropertyBrowser的安装与配置
- Qt 5框架介绍
- Qt 4 项目迁移到 Qt 5 问题
- Debian下,Qt 5.4.2 安装
- qt486中文乱码问题
- Qt 中一些常用类的中文说明
- QT生成的exe自动拷贝依赖的dll并打包的方法
- Pyqt show和exec的区别
- 【转载】PyQt QSetting保存设置
- Pyqt 控件的信号槽事件定义方法
- QT设计界面遍历文件夹进而计算hash码
- Qt5官方demo解析集37——Vector Deformation