Qt QPushButton 解决触摸屏点击 pressed样式表无效 您所在的位置:网站首页 触摸按住延迟短还是长影响玩吃鸡吗 Qt QPushButton 解决触摸屏点击 pressed样式表无效

Qt QPushButton 解决触摸屏点击 pressed样式表无效

2023-11-23 11:56| 来源: 网络整理| 查看: 265

目录 1.简述2.解决思路3.代码

1.简述 QPushButton{backgroud:red;} QPushButton:pressed{backgroud:gray;}

Qt5.7.1 以上样式表,在Win10的触摸屏上,触摸不松开,按钮没有按下效果。

2.解决思路

翻阅文章,虽然没有找到解决办法,但是有得到一个有价值的信息,触摸事件和鼠标事件有差异。 先打印按钮鼠标和触摸按下的事件有什么区别。 继承QPushButton,设置接受触摸事件,重写event()函数,打印点击按钮所产生的事件

setAttribute(Qt::WA_AcceptTouchEvents,true); //接受所有触摸事件

打印正常鼠标点击按钮产生的事件

QEvent::QMousePressed //鼠标按下 QEvent::QMouseReleased //鼠标松开

打印触摸按钮产生的事件

QEvent::QTouchBegin //触摸按下 QEvent::QTouchUpdate //触摸保持 QEvent::QTouchEnd //触摸松开后 QEvent::QMousePressed //触摸松开后 QEvent::QMouseReleased //触摸松开后

从触摸事件来看,手指松开的时候pressed和released事件先后发出,QPushButton连续绘制了pressed和normal的样式。几乎没啥时间间隔,也就看不到pressed按下的效果。

QTouchBegin和QTouchEnd才是手指按下和松开的时间段。

如何解决? 把触摸后的事件修改为以下顺序,让pressed和released有时间间隔。

QEvent::QTouchBegin //触摸按下 QEvent::QMousePressed //触摸按下 QEvent::QTouchUpdate //触摸保持 QEvent::QTouchEnd //触摸松开后 QEvent::QMouseReleased //触摸松开后

界面刷新是事件触发的,在QTouchBegin事件产生的时候,模拟一个pressed事件, QTouchEnd的事件产生的时候,再模拟一个QMouseReleased事件,驱动QPushbutton重绘按钮样式。 注意!!! 还需要去掉QTouchEnd后的QMousePressed和QMouseReleased事件,否则clicked信号会触发两次,导致执行两次槽函数。

3.代码

CTouchButton.cpp

#include "CTouchButton.h" #include #include #include #include #include CTouchButton::CTouchButton(QWidget *parent) : QPushButton(parent) { setAttribute(Qt::WA_AcceptTouchEvents,true); } bool CTouchButton::event(QEvent *e) { switch (e->type()) { case QEvent::TouchBegin: { m_bTouchEnd = false; QMouseEvent mouseEvent(QEvent::MouseButtonPress,QPointF(0,0),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier); QCoreApplication::sendEvent(this,&mouseEvent); e->accept(); return true; } break; case QEvent::TouchEnd: { QMouseEvent mouseEvent(QEvent::MouseButtonRelease,QPointF(0,0),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier); QCoreApplication::sendEvent(this,&mouseEvent); m_bTouchEnd = true; e->accept(); return true; } break; case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: { if(m_bTouchEnd){ e->accept(); return true; } }break; default: break; } return QPushButton::event(e); }

CTouchButton.h

#ifndef CTOUCHBUTTON_H #define CTOUCHBUTTON_H #include class CTouchButton : public QPushButton { Q_OBJECT public: explicit CTouchButton(QWidget *parent = 0); protected: bool event(QEvent *e); private: bool m_bTouchEnd = false; }; #endif // CTOUCHBUTTON_H


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有