分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
在《Qt Quick 事件处理之信号与槽》中介绍了 QML 中如何使用内建类型的信号以及如何自定义信号,这次我们来看看如何处理鼠标、键盘、定时器等事件。这些时间在处理时,通常是通过信号来完成的。
鼠标事件处理
桌面开发的话,难免要处理鼠标事件……
变色矩形示例
看一个简单的处理鼠标事件的例子,先看代码(handle_mouse.qml):
import QtQuick 2.0import QtQuick.Controls 1.1Rectangle { width: 320; height: 240; MouseArea { anchors.fill: parent; acceptedButtons: Qt.LeftButton | Qt.RightButton; onClicked: { if(mouse.button == Qt.RightButton){ Qt.quit(); } else if(mouse.button == Qt.LeftButton){ color = Qt.rgba((mouse.x % 255) / 255.0 , (mouse.y % 255) / 255.0, 0.6, 1.0); } } onDoubleClicked: { color = "gray"; } }}
使用 "qmlscene handle_mouse.qml" 命令,可以看到运行效果。上面的代码仅仅是绘制一个矩形,当鼠标左键按下时改变矩形区域的颜色,鼠标右键按下时退出应用。图 1 是刚运行时的效果:
图1 handle_mouse.qml 初始运行效果
图 2 是点击鼠标左键后的效果:
图 2 鼠标左键点击后的效果
如果你点一下鼠标右键,程序会退出。
示例简陋,但足以说明如何处理鼠标事件,下面咱们慢慢来看。
MouseArea
MouseArea 对象可以附加到一个 item 上供 item 处理鼠标事件,它本身是一个不可见的 item 。在其内部,可以直接引用它所附着的对象的属性和方法。你可以将 MouseArea 理解为它所附着的 item 的代理。
MouseArea 有很多属性, enabled 用来控制是否处理鼠标事件,默认值是 true ,如果你设置为 false ,那么它所代理的 item 就会无视鼠标事件。 acceptedButtons 属性设定接收拿些个鼠标按键产生的事件(左键、右键、中键),示例代码 "acceptedButtons: Qt.LeftButton | Qt.RightButton;" 表示处理鼠标左键和右键。
作为一个 item , MouseArea 也拥有 anchors 属性,你可以使用它来描述有效的鼠标区域。示例代码 "anchors.fill: parent;" 表示整个矩形区域都接受鼠标事件。
MouseArea 还有很多其他属性,如 hoverEnabled , pressed 等等,请参考 Qt 帮助文档。
示例代码中,在 MouseArea 对象内使用了 onClicked 和 onDoubleClicked 两个信号处理器,他们对应 MouseArea 的 onClicked 和 onDoubleClicked 信号, MouseArea 还有很多其他的信号,如 onPressed / onReleased / onEntered / onExited / onPressAndHold 等等,从名字上就可以看到这些信号的含义。
onClicked 信号的参数是 MouseEvent 类型,名为 mouse ,所以你可以在信号处理器中直接使用 mouse 来查询鼠标事件的详情。比如哪个 button 按下,正如示例代码中看到的那样, MouseEvent 的 button 属性保存了被按下的鼠标按键标记, x , y 属性保存鼠标指针位置。还有一个比较重要的属性 accepted ,如果你处理鼠标事件后不想这个事件再往下传递,就置其值为 true 。
onDoubleClicked 信号代表双击事件,其参数也是 MouseEvent 类型,示例中双击鼠标,矩形颜色变为灰色。
简单的鼠标事件处理就这些内容,根据你应用的需要,可能你还会处理 onPressed / onReleased / onEntered 等等信号,请参考 Qt 帮助。
键盘事件处理
手机上你可能较少处理键盘事件(有一个例外,BACK 按键),但是电脑上你免不了要响应键盘。
会动的文本实例
先看示例代码,handle_key.qml :
import QtQuick 2.0import QtQuick.Controls 1.1Rectangle { width: 320; height: 480; color: "gray"; focus: true; Keys.enabled: true; Keys.onEscapePressed: { Qt.quit(); } Keys.forwardTo: [moveText, likeQt]; Text { id: moveText; x: 20; y: 20; width: 200; height: 30; text: "Moving Text"; color: "blue"; //focus: true; font { bold: true; pixelSize: 24;} Keys.enabled: true; Keys.onPressed: { switch(event.key){ case Qt.Key_Left: x -= 10; break; case Qt.Key_Right: x += 10; break; case Qt.Key_Down: y += 10; break; case Qt.Key_Up: y -= 10; break;