Qt Quick鼠标事件处理、键盘、计时器
在《Qt Quick 事件处理之信号与槽》中介绍了 QML 中怎样使用内建类型的信号以及怎样自己定义信号,这次我们来看看怎样处理鼠标、键盘、定时器等事件。这些时间在处理时,一般是通过信号来完毕的。
鼠标事件处理
桌面开发的话,难免要处理鼠标事件……
变色矩形演示样例
看一个简单的处理鼠标事件的样例,先看代码(handle_mouse.qml):
import QtQuick 2.0
import QtQuick.Controls 1.1 Rectangle {
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 是刚执行时的效果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
图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.0
import QtQuick.Controls 1.1 Rectangle {
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;
default:
return;
}
event.accepted = true;
}
} CheckBox {
id: likeQt;
text: "Like Qt Quick";
anchors.left: parent.left;
anchors.leftMargin: 10;
anchors.bottom: parent.bottom;
anchors.bottomMargin: 10;
z: 1;
}
}
这个演示样例通过上下左右四个按键移动一个文本串。空格键选中复选框, Esc 键退出应用。
图 3 是初始执行效果图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
图 3 handle_key 初始效果
图 4 是我按了几次方向键,按了空格键后的效果:
图 4 移动文本,选中复选框
以下解释演示样例代码。介绍怎样使用 Keys 对象和信号处理器处理按键事件
Keys 与 信号处理器
事实上在 《Qt Quick 事件处理之信号与槽》、《Qt Quick 简单教程》和 《QML 语言基础》三篇文章中我们都有提到 Keys 对象,有的演示样例中也用到过,这里呢,我们专门介绍一下,力求使大家对 Keys 及按键处理有个较为全面的了解。
Keys 对象是 Qt Quick 提供的。专门供 Item 处理按键事件的对象。
它定义了非常多针对特定按键的信号,比方 onReturnPressed / onEscapePressed / onDownPressed / onDigit0Pressed / onBackPressed 等等;它还定义了更为普通的 onPressed 和 onReleased 信号,一般地。你能够使用这两个信号来处理大部分按键(请对比 Qt C++ 中的 keyPressEvent 和 keyReleaseEvent 来理解)。它们有一个名字是 event 的 KeyEvent 參数。包括了按键的具体信息。
KeyEvent 代表一个按键事件。假设一个按键被处理, event.accepted 应该被设置为 true 以免它被继续传递;要是你不设置它,那它可能会继续传递给其它的 item ,出现一些奇奇怪怪的问题。
Keys 有三个属性。
enabled 属性控制是否处理按键。
forwardTo 属性是列表类型,它表示传递按键事件给列表内的对象。假设某个对象 accept 了某个按键,那位列其后的对象就不会收到该按键事件。演示样例代码 "Keys.forwardTo: [moveText, likeQt];" 表明转发按键给 id 为 moveText 的 Text 对象和 id 为 likeQt 的 CheckBox 对象。
moveText 在前面,假设它消耗掉某个键。 likeQt 就收不到了。你能够改动 Text 对象的 Keys.onPressed 附加信号处理器。在 case 列表中加入 Qt.Key_Space 看看效果。
priority 属性同意你设置 Keys 附加属性的优先级。有两种,在 Item 之前处理按键,这是默认行为,在 Item 之后处理按键。
你能够对比着 Qt C++ 的 keyPressEvent() 函数来理解,假设你在派生类中重载了 keyPressEvent() 方法,那么你能够在重载方法的一開始调用父类的 keyPressEvent() 。也能够在你处理完感兴趣的事件后再调用父类的 keyPressEvent() 。这期间的逻辑关系也非常easy。假如 Keys 先处理按键,如它吃掉了某个键。它所依附的 Item 对象就收不到这个按键了;反之亦然。
Qt Quick 提供的一些元素本身会处理按键,比方演示样例中的 CheckBox ,它响应空格键来选中或取消选中。
而我们不须要给它附加 Keys 对象来再次处理按键事件。当然,假设你想改变它的按键响应逻辑,能够这么做。在解释 priority 属性时已经提到这点。
最后另一点要说明的是。假设你想某个元素处理按键,须要把焦点给它,这通过 Item 的 focus 属性来控制,置 true 就可以。
如今再来解释下演示样例代码。
Rectangle 对象的附加信号处理器 Keys.onEscapePressed 调用 Qt.quit() 退出,小白非常,不说了。
Text 对象实现了 Keys.onPressed 附加信号处理器,使用 switch-case 语句,分拣 event 參数的 key 属性。假设是上下左右四个键,就变更 Text 的位置。置 accepted 为 true 。声明这几个按键已名花有主找到归宿;否则就直接返回。给别人机会处理按键。你也看到了,正是由于这样。 CheckBox 才干拿到空格键来选中或取消复选框。
演示样例中的 CheckBox 对象定义时,没有专门处理按键,由于 Qt Quick 提供的实现已经处理了按键了。
嗯嗯,貌似内容非常少?走着。看定时器去。
定时器
定时器的作用还要说吗?好像有点儿啰嗦了呀。定时器么,就是周期性触发的一个事件,和寻经常使用的闹钟差点儿相同。你能够利用定时器来完毕一些周期性的任务,比方检查和server的连接呆死了没。比方备份用户数据……
定时器对象介绍
在 QML 中, Timer 代表定时器。使用起来也非常easy,响应其 onTriggered() 信号就可以,它也就这么一个实用的信号。
另外它还有几个属性要说明一下, interval 指定定时周期,单位是毫秒,默认值是 1000 毫秒; repeat 设定定时器是周期性触发还是一次性触发,默认是一次性的(好像和 QTimer 不一样嗳)。running 属性。设置为 true 定时器就開始工作。设置为 false 就歇菜。默认是 false 。 triggeredOnStart 属性。怎么说呢, Qt 总是对我们这么好都有点儿那啥不好意思了,这个属性是考虑到有些同志的特殊需求。本来定时器启动后要等待设定的间隔才触发,假设你设置这个属性为 true ,那定时器開始执行时立刻先触发一次,默认值是 false 。
Timer 还有 start() / stop() / restart() 三个方法能够调用,它们会影响 running 属性,望文生义吧您。
如今来看一个简单的演示样例。倒计时。
倒计时程序
世界杯倒计时按天算,山中一日世上千年,咱们这个演示样例用1秒顶它一天,倒数十秒。然后就开香槟庆祝下。
看代码(count_down.qml):
import QtQuick 2.0
import QtQuick.Controls 1.1 Rectangle {
width: 320;
height: 240;
color: "gray";
QtObject{
id: attrs;
property int counter;
Component.onCompleted:{
attrs.counter = 10;
}
} Text {
id: countShow;
anchors.centerIn: parent;
color: "blue";
font.pixelSize: 40;
} Timer {
id: countDown;
interval: 1000;
repeat: true;
triggeredOnStart: true;
onTriggered:{
countShow.text = attrs.counter;
attrs.counter -= 1;
if(attrs.counter < 0)
{
countDown.stop();
countShow.text = "Clap Now!";
}
}
} Button {
id: startButton;
anchors.top: countShow.bottom;
anchors.topMargin: 20;
anchors.horizontalCenter: countShow.horizontalCenter;
text: "Start";
onClicked: {
countDown.start();
}
}
}
我在界面上放了个 Text 对象。它以下放一按钮。 Rectangle 对象内定义了一个 Timer 对象,默认不启动。当用户点击 "Start" 按钮时启动定时器。我还设置了定时器的 triggeredOnStart 属性哦,周期是 1 秒。
计数保存在 QtObject 对象中, id 是 attrs 。在附加信号处理器 Component.onCompleted 中初始化 counter 属性的值为 10 。而在 Timer 对象的 onTriggered 信号处理器中递减 counter ,当 counter 为 0 时改动 Text 对象的文本为 "Clap Now!" 。
喏,就这么简单。
来看下效果。图 5 是初始效果:
图 5 倒计时程序初始效果
图 6 是计时效果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
图 6 计时
图 7 是倒计时结束的效果:
图 7 倒计时结束
假设你使用 qmlscene 执行 countdown.qml 文档,可能会发现它有一个 BUG 哦, "Start" 按钮第一次点击能够正常倒数计时。完了下次就不行了……我已经找到问题所在,不过还是留给你解决吧。
回想一下。温故知新:
版权声明:本文博客原创文章。博客,未经同意,不得转载。
Qt Quick鼠标事件处理、键盘、计时器的更多相关文章
- Qt Quick 事件处理之鼠标、键盘、定时
一.鼠标事件 MouseArea 对象可以附加到一个 item 上供 item 处理鼠标事件,它本身是一个不可见的 item .在其内部,可以直接引用它所附着的对象的属性和方法.你可以将 MouseA ...
- Qt Quick 事件处理之信号与槽
前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...
- Qt Quick 事件处理之信号与槽(foruok的博客)
前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简 ...
- QT 11 鼠标键盘事件添加
鼠标事件 void mousePressEvent(QMouseEvent *event); //单击 void mouseReleaseEvent(QMouseEvent *event); //释放 ...
- Qt之股票组件-股票检索--支持预览框、鼠标、键盘操作
目录 一.感慨一下 二.效果展示 三.搜索编辑框 1.编辑框 2.预览框 四.相关文章 原文链接:Qt之股票组件-股票检索--支持预览框.鼠标.键盘操作 一.感慨一下 之前做过一款炒股软件,个人觉着是 ...
- Qt Quick实现的涂鸦程序
之前一直以为 Qt Quick 里 Canvas 才干够自绘.后来发觉不是,原来还有好几种方式都能够画图! 能够使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染).能够构造QSGN ...
- Qt Quick实现的疯狂算数游戏
使用 Qt Quick 写了个小游戏:疯狂算数.支持 Windows 和 Android 两个平台. 游戏简单,但牵涉到下面你的 Qt Quick 主题: 自己实现一个按钮 自适应分辨率 国际化 QM ...
- Qt Quick 布局演示
于 Qt Widgets 于,我们经常使用许多布局管理器来管理界面 widgets . 于 Qt Quick 实际上,有两个相关的管理和布局库,所谓集 Item Positioner ,所谓集 Ite ...
- Qt Quick 组件和动态创建的对象具体的解释
在<Qt Quick 事件处理之信号与槽>一文中介绍自己定义信号时,举了一个简单的样例.定义了一个颜色选择组件,当用户在组建内点击鼠标时,该组件会发出一个携带颜色值的信号,当时我使用 Co ...
随机推荐
- Xcode的Architectures、Valid Architectures和Build Active Architecture Only属性
Architectures 这代表,在这个项目里你想要Xcode编译的目标设备列表. Valid Architectures 还不是太明确这个设置的意图,但是一般来说是不需要更改的,和Architec ...
- 史上最详细的Android Studio系列教程一--下载和安装
链接地址:http://segmentfault.com/a/1190000002401964#articleHeader4 原文链接:http://stormzhang.com/devtools/2 ...
- BZOJ 1216: [HNOI2003]操作系统( 优先队列 )
按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #inclu ...
- 转: Firefox 浏览器对 TABLE 中绝对定位元素包含块的判定有错误
标准参考 元素的包含块 W3C CSS2.1 规范中规定,绝对定位元素的包含块(containing block),由离它最近的 position 特性值是 "absolute". ...
- 引用 xp系统引导修复(转载)
引用 3592wangxiaoxi 的 xp系统引导修复(转载) 原文来自百度知道a12424106关于“急需xp系统引导方面的知识!”的回复. XP系统的引导过程 如果想学习排除计算机系统故障,首先 ...
- 在 vb中 "end","unload me","exit sub" 之间的区别
之前就想过这个问题,这么熟悉的几个东西居然对他们分析的不是很透彻. “End” 跟 “Unload Me” 在敲程序 的时候经常敲到,“exit sub” 更是熟悉,下面,解析: End ...
- 编译cm12.1
背景 Ubuntu 14.04 64位,硬盘空间大于100G 更新系统至最新版本号,在终端下输入 sudo apt-get update sudo apt-get upgrade 安装编译必需软件包 ...
- 一天一个类--ArrayList之一
今天开始打算将JDK7种的一些类的源码分析一下,笔者认为了解源码就是了解其实现过程,这是非常重要的,而不是简单的记住方法的使用,关键是了解其思想和目的这才是重要的.所以笔者决定首先将从一些容器下手.[ ...
- 09-UIKit(UICollectionViewController、UITabBarController)
目录: 一.UICollectionViewController 二.UITabBarController(标签控制器) 三.视图和试图控制器的生命周期 四.其他控件 回到顶部 一.UICollect ...
- 演练5-6:Contoso大学校园管理系统6
在上一次的教程中,我们处理了关联数据问题.这个教程演示如何处理并发问题.你将使用Department实体创建一个页面,这个页面在支持编辑和删除的同时,还可以处理并发错误.下面的截图演示了Index页面 ...