一、鼠标事件

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 帮助文档。

变色矩形示例

看一个简单的处理鼠标事件的例子,先看代码:

import QtQuick 2.2
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";
}
}
}

上面代码中,在 MouseArea 对象内使用了onClickedonDoubleClicked两个信号处理程序,他们对应 MouseArea 的onClickedonDoubleClicked信号。另外,如果你点一下鼠标右键,程序会退出。

使用 "qmlscene handle_mouse.qml" 命令,可以看到运行效果。上面的代码仅仅是绘制一个矩形,当鼠标左键按下时改变矩形区域的颜色,鼠标右键按下时退出应用。下面是刚运行时的效果图:

下面是点击鼠标左键后的效果图:

二、键盘事件

Keys 对象是 Qt Quick 提供的,专门供 Item 处理按键事件的对象。它定义了很多针对特定按键的信号,比如onReturnPressed / onEscapePressed / onDownPressed / onDigit0Pressed / onBackPressed等等;它还定义了更为普通的onPressedonReleased信号,一般地,你可以使用这两个信号来处理大部分按键。

KeyEvent 代表一个按键事件,如果一个按键被处理,event.accepted应该被设置为 true 以免它被继续传递;要是你不设置它,那它可能会继续传递给其他的 item,出现一些奇奇怪怪的问题。

Keys 有三个属性:

  • enabled 属性控制是否处理按键。

  • forwardTo 属性是列表类型,它表示传递按键事件给列表内的对象,如果某个对象 accept 了某个按键,那位列其后的对象就不会收到该按键事件。

    示例代码:Keys.forwardTo: [moveText, likeQt];,表明转发按键给 id 为 moveText 的 Text 对象和 id 为 likeQt 的 CheckBox 对象。 moveText 在前面,如果它消耗掉某个键, likeQt 就收不到了。

  • priority 属性允许你设置 Keys 附加属性的优先级,有两种,在 Item 之前处理按键,这是默认行为,在 Item 之后处理按键。

Qt Quick 提供的一些元素本身会处理按键,比如 CheckBox ,它响应空格键来选中或取消选中,而我们不需要给它附加 Keys 对象来再次处理按键事件。

最后还有一点要说明的是,如果你想某个元素处理按键,需要把焦点给它,这通过 Item 的 focus 属性来控制,置 true 即可。

简单示例

下面来看一个示例代码:

import QtQuick 2.2
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 键退出应用。下面是初始运行效果图:

下面是我按了几次方向键,按了空格键后的效果图:

三、定时器

在 QML 中, Timer 代表定时器,使用起来也很简单,响应其onTriggered()信号即可,它也就这么一个有用的信号。另外它还有几个属性要说明一下:

  • interval 指定定时周期,单位是毫秒,默认值是 1000 毫秒;
  • repeat 设定定时器是周期性触发还是一次性触发,默认是一次性的;
  • running 属性,设置为 true 定时器就开始工作,设置为 false 就歇菜,默认是 false ;
  • triggeredOnStart 属性,这个属性是考虑到有些人的特殊需求,本来定时器启动后要等待设定的间隔才触发,如果你设置这个属性为 true ,那定时器开始执行时立马先触发一次,默认值是 false 。

Timer 还有 start()、stop()、restart() 三个方法可以调用,它们会影响 running 属性。

十秒倒计时程序

代码如下:

import QtQuick 2.2
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!" 。

来看下效果。下面是初始效果图:

下面是计时效果图:

下图是倒计时结束的效果图:

参考:

《Qt Quick核心编程》第6章

Qt Quick事件处理之鼠标、键盘、定时器

Qt Quick 事件处理之鼠标、键盘、定时的更多相关文章

  1. Qt Quick 事件处理之信号与槽

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...

  2. Qt Quick 事件处理之信号与槽(foruok的博客)

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简 ...

  3. Qt移植对USB鼠标键盘、触摸屏的支持

    .USB键盘 经过一番搜索,发现对Qt键盘的支持主要关系到两个方面: 1. 键盘类型确定: 4.7以前的Qt版本,如果是PS2圆孔键盘,Qt编译时需加上选项:-qt-kbd-vr41xx(未测试):如 ...

  4. Qt Quick实现的涂鸦程序

    之前一直以为 Qt Quick 里 Canvas 才干够自绘.后来发觉不是,原来还有好几种方式都能够画图! 能够使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染).能够构造QSGN ...

  5. Qt Quick实现的疯狂算数游戏

    使用 Qt Quick 写了个小游戏:疯狂算数.支持 Windows 和 Android 两个平台. 游戏简单,但牵涉到下面你的 Qt Quick 主题: 自己实现一个按钮 自适应分辨率 国际化 QM ...

  6. Qt Quick 布局演示

    于 Qt Widgets 于,我们经常使用许多布局管理器来管理界面 widgets . 于 Qt Quick 实际上,有两个相关的管理和布局库,所谓集 Item Positioner ,所谓集 Ite ...

  7. Qt Quick 组件和动态创建的对象具体的解释

    在<Qt Quick 事件处理之信号与槽>一文中介绍自己定义信号时,举了一个简单的样例.定义了一个颜色选择组件,当用户在组建内点击鼠标时,该组件会发出一个携带颜色值的信号,当时我使用 Co ...

  8. Qt Quick 图像处理实例之美图秀秀(附源代码下载)

    在<Qt Quick 之 QML 与 C++ 混合编程具体解释>一文中我们解说了 QML 与 C++ 混合编程的方方面面的内容,这次我们通过一个图像处理应用.再来看一下 QML 与 C++ ...

  9. Qt Quick综合实例之文件查看器

    假设你基于Qt SDK 5.3.1来创建一个Qt Quick App项目,项目模板为你准备的main.qml文档的根元素是ApplicationWindow或Window.这次我们就以Applicat ...

随机推荐

  1. C# based on PdfSharp to split pdf files and get MemoryStream C#基于PdfSharp拆分pdf,并生成MemoryStream

    install-package PdfSharp -v 1.51.5185-beta using System; using PdfSharp.Pdf; using System.IO; using ...

  2. FocusVisualStyle

    <Style x:Key="MyFocusVisual">      <Setter Property="Control.Template"& ...

  3. mssql附加的数据库查询的时候没有搜索权限

    1.选中数据安全性-登录名-选择某个账户-右键-属性 2.服务器角色-选择public和systemadmin 3.用户映射-选中库-下面选中public 和owner

  4. 小鸟初学Shell编程(八)环境变量、预定义变量与位置变量

    环境变量 环境变量:每个Shell打开都可以获得到的变量. 我们知道通过export的方式打开可以让子进程读取父进程的变量的值,那怎么样才能让每一个进程都能读取到变量的值呢? 在这呢,系统有一些默认的 ...

  5. Android四大组件:BroadcastReceiver 介绍

    介绍 BroadcastReceiver 即广播组件,是 Android 的四大组件之一.用于监听和接收广播消息,并做出响应.有以下一些应用: 不同组件之间的通信(应用内或不同应用之间). 多线程之间 ...

  6. c# list集合简单快捷取随机

    C#怎么在list集合中随机取出一个值: 首先我们取出这个List列表 然后生成随机数 最后通过这个随机数当作索引实现 var list = studentlist.OrderBy(a => a ...

  7. 4、Work-Queue

    Work Queues using the Java Client In the first tutorial we wrote programs to send and receive messag ...

  8. devops 下测试组织管理面临的挑战及应对

    导读 先从引发的5个问题讲起,再简单回顾一下devops 简介和兴起背景 ,再从itest 测试管理团队的视角提出应对办法 DevOps后,测试面临的挑战        敏捷开发必然是迭代开发管理模式 ...

  9. 创建maven父子项目(九)

    一.父子-聚合项目 通过 maven 可以创建父子-聚合项目. 所谓的父子项目,即有一个父项目,有多个子项目.这些子项目,在业务逻辑上,都归纳在这个父项目下,并且一般来说,都会有重复的jar包共享.所 ...

  10. Vue项目零碎知识(全局js,css配置,element-UI,bs使用, img动态配置,js数组)

    全局css样式,首先在静态assets中写好文件,然后要在main.js中配置 // 配置全局css样式 // import '@/assets/css/global.css' require('@/ ...