QPushButton{backgroud:red;}
QPushButton:pressed{backgroud:gray;}
Qt5.7.1 以上样式表,在Win10的触摸屏上,触摸不松开,按钮没有按下效果。
翻阅文章,虽然没有找到解决办法,但是有得到一个有价值的信息,触摸事件和鼠标事件有差异。
先打印按钮鼠标和触摸按下的事件有什么区别。
继承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信号会触发两次,导致执行两次槽函数。
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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务