qt编写触摸事件的关键

提要

无论你的电脑是支持触摸屏,还是你通过usb外部连接触摸屏,都能验证你的触摸程序功能。下面说说程序中使用触摸按钮等。

示例

  1. 按钮可以实现触摸功能;
  2. 自动义控件可以实现触摸按下拖动;
  3. 触摸长按出现对话框(也可以是其它控件)。

按钮可以实现触摸功能

只需要在该按钮所在的对话框的构造函数中添加下面一句:

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事件中实现相关功能。
注意:以上可能只适用于窗口,小控件,至于场景视图这些不一定完全适用,还需做一些改动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus_查询进阶05

查询专栏&#xff1a;select语句中不列出全部字段 文章目录1. 第一种形式2. 第二种形式1. 第一种形式 通过queryWrapper调用select方法&#xff0c;在select方法中添加需要查询的列 /*** 1. 名字包含雨并且年齡小于40* sql&#xff1a;name like %雨% and age < 40*/Testp…

甲骨文中国裁员已定,补偿为N+6;VMware联手云平台合作伙伴AsiaPac,闪耀狮城;对标英伟达,寒武纪新货曝光……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 乐视改乐融&#xff0c;重新…

qt自定义窗口添加父窗口后,显示不出来

提要 继承于QDialog的类&#xff0c;在被其它类创建的改对象时&#xff0c;没设置父窗口前显示正常&#xff0c;设置了父窗口后显示不出来。 自定义窗口的构造函数 configBtnNameDialog::configBtnNameDialog(QWidget *parent) :QDialog(parent),ui(new Ui::configBtnNameDial…

MyBatis-Plus_Condition作用

查询专栏&#xff1a;MP默认查询原则 查询的是数据库列名非实体类属性 文章目录在测试类中新增一个私有方法 /*** 当点击查询按钮时,查询搜索框中默认为null,也支持传入条件*当传入的条件不为null或者不为空""时,会拼接在where 的后边当做条件* param name* param em…

5G精华问答 | 大数据和5G有什么关系?

戳蓝字“CSDN云计算”关注我们哦&#xff01;即将到来的5G&#xff0c;通过提升连接速率&#xff0c;提升了“人联网”的感知&#xff0c;也促进了人类主动创造数据。另一方面&#xff0c;它更多是为“物联网”服务的。包括低延时、海量终端连接等&#xff0c;都是物联网场景的…

qt中继承pushbutton自定义控件设置按钮样式

提要 继承QPushButton后的按钮&#xff0c;设置其样式。 实现 在自定义的控件类中添加Q_OBJECT宏 在自定义的控件的类中重写paintevent函数 自定义的控件在使用时&#xff0c;必须指明其父对象 使用样式表设置样式&#xff0c;将类名改为自定义的类名 例子 直接上代码 myB…

MyBatis-Plus_实体作为条件构造器构造方法的参数

查询专栏&#xff1a;MP默认查询原则 查询的是数据库列名非实体类属性。 实体作为条件构造器构造方法的参数 文章目录/*** 1.传递的参数如果是实体类* <p>* 注&#xff1a;这种情况传递过来的参数是等值的也就是* 如果不想等值&#xff0c;例如:like 条件* 在实体类中,需…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于概率预测与随机响应面法的新能源孤岛配电网实时风险评估与调控策略》

这个标题涉及到新能源孤岛配电网的实时风险评估与调控策略&#xff0c;其中使用了概率预测和随机响应面法。下面是对标题中各个要素的解读&#xff1a; 新能源孤岛配电网&#xff1a; 新能源&#xff1a; 指的是可再生能源&#xff0c;如太阳能、风能等&#xff0c;与传统的化石…

Open Infrastructure开启开放协作新时代

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;在丹佛举办的Open Infrastructure Summit大会的Keynote演讲中&#xff0c;OpenStack基…

Qt中绑定信号槽之后,信号槽无效

下面程序编译没有错误&#xff0c;运行却未达到想要的效果&#xff0c;最后调试发现&#xff0c;是信号槽绑定后无效&#xff0c;即槽函数没有受到信号的触发。具体代码如下&#xff1a; main.cpp #include <QtCore> #include "controller.h" #include "…

MyBatis-Plus_查询返回实体对象还是map?

在常见场景下&#xff1a;返回数据建议使用map&#xff0c;不建议使用实体对象 /*** 1. 名字包含雨并且年龄小于40* sql&#xff1a;name like %雨% and age < 40* <p>* 应用场景&#xff1a;* 当表字段非常多&#xff0c;但是你只需要查询少数几列,* 没必要返回的泛型…

图解分布式架构的发展和演进 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;编注: 架构决定的系统的稳定性&#xff0c;扩展性和并发性&#xff0c;架构的演进是从…

qt中颜色对话框弹出时应用程序输出栏出现QWindowsWindow::setGeometry: Unable to set geometry 180x30+345+311 (frame: 202x8

引言 在项目中点击按钮&#xff0c;弹出颜色选择对话框&#xff0c;但同时应用程序会在应用程序输出一栏中显示 QWindowsWindow::setGeometry: Unable to set geometry 180x30345311 (frame: 202x86334266) on QWidgetWindow/"QColorDialogClassWindow" on "\…

MyBatis-Plus_LambdaQueryWrapper

查询专栏&#xff1a;建议使用LambdaQueryWrapper&#xff0c;防误写 /*** 这样写的好处防误写*/Testpublic void selectLambda() { // LambdaQueryWrapper<User> lambda new QueryWrapper<User>().lambda(); // LambdaQueryWrapper<User> lambdaQuer…

Hadoop精华问答 | 如何设置单个任务占用的内存量和CPU数目?

我们很荣幸能够见证Hadoop十年从无到有&#xff0c;再到称王。感动于技术的日新月异时&#xff0c;让我们再来看看关于Hadoop的精华问答。1Q&#xff1a;默认情况下&#xff0c;各个节点的负载不均衡&#xff08;任务数目不同&#xff09;&#xff0c;有的节点很多任务在跑&…

MyBatis-Plus_自定义sql

查询专栏&#xff1a;自定义查询sql 文章目录1. 在mapper接口中定义接口2. 在xml文件中书写sql3. 全局配置3.1 配置xml的位置3.2 配置实体类的位置4. 在实体类中测试5. 控制台输出1. 在mapper接口中定义接口 /*** 查询所有 有条件会自动拼接在where 后边当条件 单表操作** pa…

qt中下拉列表使用函数setCurrentText()设置当前显示值不能设置成功

解决方法 下拉列表设置当前显示的值&#xff0c;没有设置成功&#xff0c;是因为还需在设置前要设置下拉列表的可编辑属性为true&#xff0c;否则直接使用 函数setCurrentText&#xff08;&#xff09;设置不能成功。 const QString & strDefultSid m_sidStrList[0];//字…

Gartner:PaaS 和平台架构领域的 4 大趋势 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;Gartner公司已列出了2019年及以后影响平台即服务&#xff08;PaaS&#xff09;技术和平…

MyBatis-Plus_分页查询

查询专栏&#xff1a;myabtis 实现的分页为什么还要分页插件&#xff1f; 文章目录1. 创建分页插件2. 测试分页3. 自定义分页4. 测试自定义分页方法5. 控制台输出6. 多表操作1. 创建分页插件 Configuration public class MybatisPlusConfig {Beanpublic PaginationInterceptor…

qt设置滚动区域的滚动条的样式

引言 当窗口的控件太多&#xff0c;不能一下完全显示&#xff0c;就可以采用滚动区域来添加控件&#xff0c;这样添加的控件&#xff0c;可以通过滑动滚动区域的滚动条来浏览所有的控件。下面就大致记录一下滚动区域的滚动条的样式怎么设置。 实现 直接上设置滚动区域的滚动…