您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页Qt QPushButton 解决触摸屏点击 pressed样式表无效

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

来源:筏尚旅游网

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 <QEvent>
#include <QDebug>
#include <QCoreApplication>
#include <QMouseEvent>
#include <QTouchEvent>

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 <QPushButton>

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 © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务