qt编写触摸事件的关键
提要
无论你的电脑是支持触摸屏,还是你通过usb外部连接触摸屏,都能验证你的触摸程序功能。下面说说程序中使用触摸按钮等。
示例
- 按钮可以实现触摸功能;
- 自动义控件可以实现触摸按下拖动;
- 触摸长按出现对话框(也可以是其它控件)。
按钮可以实现触摸功能
只需要在该按钮所在的对话框的构造函数中添加下面一句:
setAttribute(Qt::WA_AcceptTouchEvents);//支持多点触控
使用的是控件自身的事件,比如按钮的clicked槽函数,添加上面的支持触控后,触摸点击按钮后就会执行槽函数相应的操作。
自动义控件可以实现触摸按下拖动
同样需要在其构造函数中添加设置支持多点触控的属性;
setAttribute(Qt::WA_AcceptTouchEvents);//支持多点触控
然后在需要拖动的控件的类中重写鼠标的按下,移动,释放事件。
//相关变量定义QPoint m_beginPos;//鼠标点击的起始位置QPoint m_leftTopPos;//窗口左上角的位置bool m_isTitle;//点击的点是否在标题栏上void configBtnNameDialog::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){//在标题栏中点击if(ui->widgetTitle->rect().contains(event->pos()))//注意此时使用pos()而不能使用globalPos(){m_beginPos = event->globalPos();//刚开始按下点的坐标m_leftTopPos = pos();//窗口左上角坐标m_isTitle = true;//是窗口标题栏}}QDialog::mousePressEvent(event);
}void configBtnNameDialog::mouseMoveEvent(QMouseEvent *event)
{if(event->buttons() == Qt::LeftButton && m_isTitle)//如果按下的是左键,且位置在标题栏上{QPoint endPos = event->globalPos();//结束点坐标QPoint offPos = endPos - m_beginPos;//结束点与开始点坐标差QPoint pos = m_leftTopPos + offPos;//左上角坐标加偏移量move(pos);//移动到该点}QDialog::mouseMoveEvent(event);//不可忘掉
}void configBtnNameDialog::mouseReleaseEvent(QMouseEvent *event)
{m_isTitle = false;QDialog::mouseReleaseEvent(event);
}
其中ui->widgetTitle为自定义的标题栏。实际上这种事件的编写,还是之前没有触摸屏时一样的事件,只是添加了支持多点触控的属性,便可以手动触摸拖动窗口标题栏。
触摸长按出现对话框(也可以是其它控件)
在按钮上长按几秒出现对话框,由于是自定义的按钮,所以需要在按钮中重写event事件,在event事件中实现长按出对话框。
同样需要在其自定义的按钮的构造函数中添加设置支持多点触控的属性;
setAttribute(Qt::WA_AcceptTouchEvents);//支持多点触控
下面是event函数的定义
//变量定义
bool m_isLongPress;//是否触屏长按
int m_second = 0;//当前的秒数
QTime m_begintime;//开始长按的时间bool myButton::event(QEvent *event)
{switch(event->type()){case QEvent::TouchBegin:{QTouchEvent* touch = static_cast<QTouchEvent*>(event);QList<QTouchEvent::TouchPoint> touchPoints = touch->touchPoints();outPut<<"myButton::event->TouchBegin点的个数为:"<<touchPoints.count();if(touchPoints.count() == 1){m_begintime = QTime::currentTime();m_second = m_begintime.hour()*3600+m_begintime.minute()*60+m_begintime.second();outPut<<"开始时间:"<<m_begintime<<"当前秒数:"<<m_second;m_isLongPress = true;}event->accept();}case QEvent::TouchUpdate:{QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints();outPut<<"myButton::event->TouchUpdate点的个数为:"<<touchPoints.count();if (touchPoints.count() == 1){outPut<<"touchPoints.count() == 1";if(m_isLongPress){outPut<<"正在被按下";QTime current_time =QTime::currentTime();int secondEnd = current_time.hour()*3600+current_time.minute()*60+current_time.second();outPut<<"时间:"<<secondEnd;if(secondEnd - m_second >= 1){//长按2秒显示设置名称的对话框showEditNameDlg();outPut<<"长按显示对话框"<<"起始时间:"<<m_begintime<<"终止时间:"<<current_time;}}}return true;}case QEvent::TouchEnd:{m_isLongPress = false;event->accept();outPut<<"释放";return true;}default:break;}return QPushButton::event(event);
}
以上是触摸长按出对话框,中间长按等待的时间可能会不一样,有时很短的时间可以出对话框,有时很长一段时间才出对话框,究其原因是进入TouchUpdate的时间不一样,如下面这样,可以很快出对话框,因为检测到了长按时间超过1秒。
2021-03-25 13:59:41 Debug:myButton::event [ 160 ] myButton::event->TouchBegin点的个数为: 1
2021-03-25 13:59:41 Debug:myButton::event [ 165 ] 开始时间: QTime(“13:59:41.356”) 当前秒数: 50381
2021-03-25 13:59:41 Debug:myButton::event [ 174 ] myButton::event->TouchUpdate点的个数为: 1
2021-03-25 13:59:41 Debug:myButton::event [ 177 ] touchPoints.count() == 1
2021-03-25 13:59:41 Debug:myButton::event [ 180 ] 正在被按下
2021-03-25 13:59:41 Debug:myButton::event [ 183 ] 时间: 50381
2021-03-25 13:59:55 Debug:myButton::event [ 174 ] myButton::event->TouchUpdate点的个数为: 1
2021-03-25 13:59:55 Debug:myButton::event [ 177 ] touchPoints.count() == 1
2021-03-25 13:59:55 Debug:myButton::event [ 180 ] 正在被按下
2021-03-25 13:59:55 Debug:myButton::event [ 183 ] 时间: 50395
2021-03-25 13:59:55 Debug:myButton::event [ 188 ] 长按显示对话框 起始时间: QTime(“13:59:41.356”) 终止时间: QTime(“13:59:55.029”)
2021-03-25 13:59:55 Debug:myButton::event [ 198 ] 释放
以上就可以通过触摸屏长按很快显示对话框,但是下面却不是,中间需要一直等待程序再次进入TouchUpdate。甚至于一直长按触摸屏,没有释放,程序也会检测到已经释放,输出释放信息。
2021-03-25 13:56:46 Debug:myButton::event [ 165 ] 开始时间: QTime(“13:56:46.032”) 当前秒数: 50206
2021-03-25 13:56:46 Debug:myButton::event [ 174 ] myButton::event->TouchUpdate点的个数为: 1
2021-03-25 13:56:46 Debug:myButton::event [ 177 ] touchPoints.count() == 1
2021-03-25 13:56:46 Debug:myButton::event [ 180 ] 正在被按下
2021-03-25 13:56:46 Debug:myButton::event [ 183 ] 时间: 50206
2021-03-25 13:56:47 Debug:myButton::event [ 198 ] 释放
2021-03-25 13:51:34 Debug:myButton::event [ 160 ] myButton::event->TouchBegin点的个数为: 1
2021-03-25 13:51:34 Debug:myButton::event [ 165 ] 开始时间: QTime(“13:51:34.172”) 当前秒数: 49894
2021-03-25 13:51:34 Debug:myButton::event [ 175 ] myButton::event->TouchUpdate点的个数为: 1
2021-03-25 13:51:34 Debug:myButton::event [ 178 ] touchPoints.count() == 1
2021-03-25 13:51:34 Debug:myButton::event [ 181 ] 正在被按下
2021-03-25 13:51:34 Debug:myButton::event [ 186 ] 时间: 49894
2021-03-25 13:51:37 Debug:myButton::event [ 203 ] 释放
但是功能上应该是正确的,可以实现长按触摸屏出现对话框。
总结
1.添加设置触摸属性,setAttribute(Qt::WA_AcceptTouchEvents);;
常规的按键之类的可以直接实现。
2.复杂一点在event事件中实现相关功能。
注意:以上可能只适用于窗口,小控件,至于场景视图这些不一定完全适用,还需做一些改动。
qt编写触摸事件的关键相关推荐
- 安卓学习笔记13:安卓触摸事件
文章目录 零.学习目标 一.安卓触摸事件概述 1.触摸分类 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 二.安卓单点触摸 三.教学案例--通过单点触摸移动米老鼠 (一)运行效果 ( ...
- Android Studio笔记4.2 安卓触摸事件
文章目录 一.前言 二.笔记4.2 安卓触摸事件 (一)安卓触摸事件概述 1.触摸分类 (1).单点触摸 (2).多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸 ...
- 3.2 安卓触摸事件
文章目录 一.安卓触摸事件概述 1.触摸分类 (1)单点触摸 (2)多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸事件处理机制 二.案例演示:通过单点触摸移动米 ...
- Android基础学习笔记13:安卓触摸事件触摸按键
学习目标 了解安卓触摸动作 熟悉触摸监听器与方法 掌握单点触摸与多点触摸 在Android系统中,触摸是用户最常用,最基础的交互方式,只有弄通触摸事件在系统中的传递处理机制才能更好地增强用户的交互体验 ...
- Android Studio 笔记4.2 安卓触摸事件
文章目录 一.前言 二.笔记4.2 安卓触摸事件 (一)安卓触摸事件概述 1.触摸分类 (1).单点触摸 (2).多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸 ...
- Android Studio学习:安卓触摸事件
(一)安卓触摸事件概述 1.触摸分类 (1)单点触摸 单点触控,只能识别和支持每次一个手指的触控.点击,若同时有两个以上的点被触碰,就不能做出正确反应.很多医院.图书馆等的大厅都有这种触控技术的电脑, ...
- 4.2 安卓触摸事件
文章目录 一.简介 二.概述 (一)安卓触摸事件概述 1.触摸分类 (1)单点触摸 (2)多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸事件处理机制 (二)案例 ...
- 4.3 安卓触摸事件
文章目录 一.安卓触摸事件概述 1.触摸分类 (1)单点触摸 (2)多点触摸 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸事件处理机制 二.案例演示:通过单点触摸移动米 ...
- 安卓编程基础——触摸事件
文章目录 前言 一.安卓事件触摸概述 1.触摸分类 2.触摸动作 3.触摸监听器 4.触摸方法 5.触点个数与坐标 6.安卓触摸事件处理机制 二.使用步骤讲解 1.创建安卓应用 3.字符串资源文件 4 ...
最新文章
- CSS文字文本样式(font字体、css外观属性)
- Tomcat安全加固
- 后台开发真的不需要看《tcpip详解》吗
- Java的多线程和线程池的使用,你真的清楚了吗?
- Java连接Redis及操作(一)
- 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.12. File-5.22...
- opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统
- linux配置4g网络命令_树莓派移动网络连接(配置4G网卡)
- Spring笔记③--spring的命名空间
- verilog换行太长代码_Verilog 之 File I/O task and function
- (42)VHDL实现多路复用器(case)
- python 中的 __name__
- file does not exist 阿里云OSS图片上传遇到的问题
- python统计词频_Python中文分词及词频统计
- 谷歌浏览器如何正确离线网页
- 带你入门HTML+CSS网页设计,编写网页代码的思路
- Navicat 中文破解版
- blastn、blastp、blastx、tblastn和tblastx的区别与用法
- 赛门铁克并购 Blue Coat 的益处显现
- python的取整函数:向上取整,向下取整,四舍五入取整
热门文章
- 双11特刊 | 云数据库RDS如何顺滑应对流量洪峰
- 掌门教育微服务体系Solar第3弹:Nacos企业级落地下篇
- Iceberg 在基于 Flink 的流式数据入库场景中的应用
- 让你久等了!《码出高效:Java 开发手册》正式发布
- 真正拿大厂offer的人,都赢在这一点
- 这些常见的分布式存储系统,你是否都了解?
- 云+X案例展 | 民生类:肯耐珂萨入围腾讯SaaS加速器首期成员名单
- lol1.7更新服务器维护,lol今天停机维护到几点11日7.1版本停机更新公告
- datax参数设置_DataX Web数据增量同步配置说明
- python冒泡排序实验报告_python中的冒泡排序