1
0
mirror of https://gitee.com/drabel/LibQQt.git synced 2025-01-04 10:18:44 +08:00

fix checknum action

This commit is contained in:
AbelTian 2018-05-18 17:34:24 +08:00
parent 33de3a1580
commit 88da5a3891
5 changed files with 142 additions and 55 deletions

View File

@ -13,8 +13,8 @@ QQtCanClickWidget::~QQtCanClickWidget()
void QQtCanClickWidget::mousePressEvent ( QMouseEvent* event ) void QQtCanClickWidget::mousePressEvent ( QMouseEvent* event )
{ {
// if ( mClickHelper ) if ( mClickHelper )
// mClickHelper->mousePressEvent ( event, this ); mClickHelper->mousePressEvent ( event, this );
return QQtWidget::mousePressEvent ( event ); return QQtWidget::mousePressEvent ( event );
} }

View File

@ -4,8 +4,12 @@ QQtClickHelper::QQtClickHelper ( QObject* parent )
{ {
mLongClickInterval = longClickInterval; mLongClickInterval = longClickInterval;
t1_press = QTime::currentTime(); now_press = QTime::currentTime().addMSecs ( 1 );
t2_release = t1_press; now_release = QTime::currentTime().addMSecs ( 2 );
nClickNumWithCancel = 0;
nLongClickNumWithCancel = 0;
nTotalClickNumWithCancel = 0;
nClickNum = 0; nClickNum = 0;
nLongClickNum = 0; nLongClickNum = 0;
@ -24,22 +28,22 @@ void QQtClickHelper::mousePressEvent ( QMouseEvent* event, QWidget* userWidget )
p2debug() << "press" << event->pos() << userWidget; p2debug() << "press" << event->pos() << userWidget;
mPoint = event->pos(); mPoint = event->pos();
mClickType = QQtClick; mClickType = QQtClick;
t1_press = QTime::currentTime(); now_press = QTime::currentTime();
} }
void QQtClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget ) void QQtClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget )
{ {
p2debug() << "release" << event->pos() << userWidget; p2debug() << "release" << event->pos() << userWidget;
//这一次 current click //这一次 current click
QTime t2_release_preview = t2_release; QTime t2_release_preview = now_release;
t2_release = QTime::currentTime(); now_release = QTime::currentTime();
//这里加了个判断,其实肯定>=0 //这里加了个判断,其实肯定>=0
if ( t1_press.msecsTo ( t2_release ) >= 0 && t1_press.msecsTo ( t2_release ) <= mLongClickInterval ) if ( now_press.msecsTo ( now_release ) >= 0 && now_press.msecsTo ( now_release ) <= mLongClickInterval )
{ {
//单击发生 //单击发生
mClickType = QQtClick; mClickType = QQtClick;
} }
else if ( t1_press.msecsTo ( t2_release ) >= 0 && t1_press.msecsTo ( t2_release ) > mLongClickInterval ) else if ( now_press.msecsTo ( now_release ) >= 0 && now_press.msecsTo ( now_release ) > mLongClickInterval )
{ {
//长击发生 //长击发生
mClickType = QQtLongClick; mClickType = QQtLongClick;
@ -47,8 +51,8 @@ void QQtClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget
//这次点击, //这次点击,
//上次的release竟然比press晚,说明press没发生,置位click //上次的release竟然比press晚,说明press没发生,置位click
//第一次click, 上一次release=press也在这里被置位click //第一次click, 上一次release=press也在这里被置位click
if ( t2_release_preview.msecsTo ( t2_release ) >= 0 if ( t2_release_preview.msecsTo ( now_release ) >= 0
&& t2_release_preview.msecsTo ( t1_press ) <= 0 ) && t2_release_preview.msecsTo ( now_press ) <= 0 )
{ {
mClickType = QQtClick; mClickType = QQtClick;
} }
@ -58,7 +62,7 @@ void QQtClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget
if ( mClickType == QQtLongClick ) if ( mClickType == QQtLongClick )
{ {
//计算点击数目 //计算点击数目
checkClickNum(); checkClickNumWithCancel();
//修改状态 //修改状态
mClickType = QQtNullClick; mClickType = QQtNullClick;
@ -75,6 +79,8 @@ void QQtClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget
} }
} }
checkClickNum ( QQtLongClick );
//发送长信号 //发送长信号
p2debug() << "send long click " ; p2debug() << "send long click " ;
emit longClick(); emit longClick();
@ -86,7 +92,7 @@ void QQtClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget
else if ( mClickType == QQtClick ) else if ( mClickType == QQtClick )
{ {
//计算点击数目 //计算点击数目
checkClickNum(); checkClickNumWithCancel();
//修改状态 //修改状态
mClickType = QQtNullClick; mClickType = QQtNullClick;
@ -103,6 +109,8 @@ void QQtClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget
} }
} }
checkClickNum ( QQtClick );
//发送单击信号 //发送单击信号
p2debug() << "send click." ; p2debug() << "send click." ;
emit click(); emit click();
@ -137,15 +145,46 @@ int QQtClickHelper::getLongClickInterval() const
return mLongClickInterval; return mLongClickInterval;
} }
quint32 QQtClickHelper::clickNum() const { return nClickNum; }
quint32 QQtClickHelper::longClickNum() const { return nLongClickNum; } void QQtClickHelper::checkClickNumWithCancel()
quint64 QQtClickHelper::totalClickNum() const { return nTotalClickNum; }
void QQtClickHelper::checkClickNum()
{ {
switch ( mClickType ) switch ( mClickType )
{
case QQtClick:
{
nClickNumWithCancel++;
if ( nClickNumWithCancel >= 0xFFFFFFFF )
{
p2debug() << "out......";
nClickNumWithCancel = 0;
}
}
break;
case QQtLongClick:
{
nLongClickNumWithCancel++;
if ( nLongClickNumWithCancel >= 0xFFFFFFFF )
{
p2debug() << "out......";
nLongClickNumWithCancel = 0;
}
}
break;
default:
break;
}
nTotalClickNumWithCancel = nClickNumWithCancel + nLongClickNumWithCancel;
if ( nTotalClickNumWithCancel >= 0xFFFFFFFFFFFFFFFF )
{
p2debug() << "out......";
nTotalClickNumWithCancel = 0;
}
}
void QQtClickHelper::checkClickNum ( QQtClickHelper::QQtClickType type )
{
switch ( type )
{ {
case QQtClick: case QQtClick:
{ {

View File

@ -55,9 +55,13 @@ public:
void setLongClickInterval ( int millSecond = longClickInterval ); void setLongClickInterval ( int millSecond = longClickInterval );
int getLongClickInterval() const; int getLongClickInterval() const;
quint32 clickNum() const; inline const quint32 clickNum() const { return nClickNum; }
quint32 longClickNum() const; inline const quint32 longClickNum() const { return nLongClickNum; }
quint64 totalClickNum() const; inline const quint64 totalClickNum() const { return nTotalClickNum; }
inline const quint32 clickNumWithCancel() const { return nClickNumWithCancel; }
inline const quint32 longClickNumWithCancel() const { return nLongClickNumWithCancel; }
inline const quint64 totalClickNumWithCancel() const { return nTotalClickNumWithCancel; }
/** /**
* *
@ -91,15 +95,20 @@ protected:
int mLongClickInterval; int mLongClickInterval;
//click 检测使用 //click 检测使用
QTime t1_press;//press relase QTime now_press;//press relase
QTime t2_release;//release QTime now_release;//release
//click num //click num
virtual void checkClickNum(); virtual void checkClickNumWithCancel();
virtual void checkClickNum ( QQtClickType type );
quint32 nClickNum; quint32 nClickNum;
quint32 nLongClickNum; quint32 nLongClickNum;
quint64 nTotalClickNum; quint64 nTotalClickNum;
quint32 nClickNumWithCancel;
quint32 nLongClickNumWithCancel;
quint64 nTotalClickNumWithCancel;
}; };
#endif // QQTCLICKHELPER_H #endif // QQTCLICKHELPER_H

View File

@ -6,17 +6,18 @@ QQtDoubleClickHelper::QQtDoubleClickHelper ( QObject* parent ) :
mDoubleClickInterval = doubleClickInterval; mDoubleClickInterval = doubleClickInterval;
nDoubleClickNum = 0; nDoubleClickNum = 0;
nDoubleClickNumWithCancel = 0;
t1_doubleclick = QTime::currentTime(); prev_doubleclick = QTime::currentTime().addMSecs ( 3 );
t2_doubleclick = t2_doubleclick; now_doubleclick = QTime::currentTime().addMSecs ( 4 );
t2_release_initial = QTime::currentTime(); p2debug() << prev_doubleclick.msecsTo ( now_doubleclick );
t2_release_preview = t2_release_initial;
prev_release = QTime::currentTime().addMSecs ( 5 );
now_release_initial = QTime::currentTime().addMSecs ( 6 );
mMouseEvent = new QQtMouseEvent; mMouseEvent = new QQtMouseEvent;
mClickType = QQtNullClick;
m_click_timer = new QTimer ( this ); m_click_timer = new QTimer ( this );
m_click_timer->setSingleShot ( false ); m_click_timer->setSingleShot ( false );
//击发延迟20ms //击发延迟20ms
@ -53,7 +54,7 @@ void QQtDoubleClickHelper::mousePressEvent ( QMouseEvent* event , QWidget* userW
m_click_timer->stop(); m_click_timer->stop();
//复用一下t1_press t2_release 这里的实现和父类关系不太大 //复用一下t1_press t2_release 这里的实现和父类关系不太大
t1_press = QTime::currentTime(); now_press = QTime::currentTime();
} }
void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget ) void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* userWidget )
@ -61,8 +62,8 @@ void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* user
p2debug() << "release" << event->pos() << userWidget; p2debug() << "release" << event->pos() << userWidget;
//添加longClick检测, 更新longclick检测时间 //添加longClick检测, 更新longclick检测时间
t2_release_preview = t2_release;//记录上次的release prev_release = now_release;//记录上次的release
t2_release = QTime::currentTime(); now_release = QTime::currentTime();
//在release-press>longclick暨click时钟判定为longclick后 加一次判断修复误判 防止用户不发press,引起click一直longclick. //在release-press>longclick暨click时钟判定为longclick后 加一次判断修复误判 防止用户不发press,引起click一直longclick.
// if ( t1_press.msecsTo ( t2_release ) >= mLongClickInterval // if ( t1_press.msecsTo ( t2_release ) >= mLongClickInterval
// && t2_doubleclick.msecsTo ( t2_release ) >= 0 // && t2_doubleclick.msecsTo ( t2_release ) >= 0
@ -75,19 +76,20 @@ void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* user
//doubleClick检测不依赖press,所以只要发release就会有doubleClick发生. //doubleClick检测不依赖press,所以只要发release就会有doubleClick发生.
//检测方式: 两次release的间隔小于doubleClickInterval那么触发doubleClick. //检测方式: 两次release的间隔小于doubleClickInterval那么触发doubleClick.
//这一次 current click //这一次 current click
t1_doubleclick = QTime::currentTime(); now_doubleclick = QTime::currentTime();
//这里有小技巧: 这里没有加 && mClickType != QQtClick //这里有小技巧: 这里没有加 && mClickType != QQtClick
//难道不会和click时钟混淆吗?不会,因为click时钟那边用的startTime和nowTime两个变量, t2比startTime还早,t1比nowTime还晚,t1-t2绝对比nowTime-startTime还长. //难道不会和click时钟混淆吗?不会,因为click时钟那边用的startTime和nowTime两个变量, t2比startTime还早,t1比nowTime还晚,t1-t2绝对比nowTime-startTime还长.
//如果是click,绝对不会混淆成doubleClick. //如果是click,绝对不会混淆成doubleClick.
//正好mDoubleClickInterval ms代表双击 不代表单击. //正好mDoubleClickInterval ms代表双击 不代表单击.
if ( t2_doubleclick.msecsTo ( t1_doubleclick ) >= 0 p2debug() << prev_doubleclick << now_doubleclick << mClickType;
&& t2_doubleclick.msecsTo ( t1_doubleclick ) < mDoubleClickInterval ) if ( prev_doubleclick.msecsTo ( now_doubleclick ) >= 0
&& prev_doubleclick.msecsTo ( now_doubleclick ) < mDoubleClickInterval )
{ {
//双击发生 //双击发生
mClickType = QQtDoubleClick; mClickType = QQtDoubleClick;
} }
//上一次 prev click //上一次 prev click
t2_doubleclick = QTime::currentTime(); prev_doubleclick = QTime::currentTime();
//梳理状态 //梳理状态
m_long_click_timer->stop(); m_long_click_timer->stop();
@ -96,7 +98,7 @@ void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* user
if ( mClickType == QQtLongClick ) if ( mClickType == QQtLongClick )
{ {
//计算点击数目 //计算点击数目
checkClickNum(); checkClickNumWithCancel();
//修改状态 //修改状态
mClickType = QQtNullClick; mClickType = QQtNullClick;
@ -113,6 +115,8 @@ void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* user
} }
} }
checkClickNum ( QQtLongClick );
//发送长信号 //发送长信号
p2debug() << "send long click " ; p2debug() << "send long click " ;
emit longClick(); emit longClick();
@ -124,7 +128,7 @@ void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* user
else if ( mClickType == QQtDoubleClick ) else if ( mClickType == QQtDoubleClick )
{ {
//计算点击数目 //计算点击数目
checkClickNum(); checkClickNumWithCancel();
//修改状态 //修改状态
mClickType = QQtNullClick; mClickType = QQtNullClick;
@ -141,6 +145,8 @@ void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* user
} }
} }
checkClickNum ( QQtDoubleClick );
//发送双击信号 //发送双击信号
p2debug() << "send double click." ; p2debug() << "send double click." ;
emit doubleClick(); emit doubleClick();
@ -152,7 +158,7 @@ void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* user
else if ( mClickType == QQtClick ) else if ( mClickType == QQtClick )
{ {
//计算点击数目 //计算点击数目
checkClickNum(); checkClickNumWithCancel();
//修改状态 //修改状态
mClickType = QQtNullClick; mClickType = QQtNullClick;
@ -169,6 +175,8 @@ void QQtDoubleClickHelper::mouseReleaseEvent ( QMouseEvent* event, QWidget* user
} }
} }
checkClickNum ( QQtClick );
//发送单击信号 //发送单击信号
p2debug() << "send click." ; p2debug() << "send click." ;
emit click(); emit click();
@ -220,23 +228,23 @@ void QQtDoubleClickHelper::slotClickTimeout()
//注意:必须和点击一样在超时的时候检测,否则和双击检测冲突,分不清是长击还是双击.导致长击必发. //注意:必须和点击一样在超时的时候检测,否则和双击检测冲突,分不清是长击还是双击.导致长击必发.
//注意:必须press击发. //注意:必须press击发.
//不发press 发生误判 认为总是long click //不发press 发生误判 认为总是long click
if ( t1_press.msecsTo ( t2_release ) >= 0 if ( now_press.msecsTo ( now_release ) >= 0
&& t1_press.msecsTo ( t2_release ) >= mLongClickInterval ) && now_press.msecsTo ( now_release ) >= mLongClickInterval )
{ {
//长击发生 //长击发生
mClickType = QQtLongClick; mClickType = QQtLongClick;
//有误判, 未发press的时候, 这个一直都是longclick,其实还有click //有误判, 未发press的时候, 这个一直都是longclick,其实还有click
//press比前一次release小的时候 其实是click //press比前一次release小的时候 其实是click
if ( t2_release_preview.msecsTo ( t2_release ) >= 0 if ( prev_release.msecsTo ( now_release ) >= 0
&& t2_release_preview.msecsTo ( t1_press ) <= 0 ) && prev_release.msecsTo ( now_press ) <= 0 )
{ {
mClickType = QQtClick; mClickType = QQtClick;
} }
//initial press //initial press
if ( t2_release_preview.msecsTo ( t2_release ) >= 0 if ( prev_release.msecsTo ( now_release ) >= 0
&& t2_release_preview == t2_release_initial ) && prev_release == now_release_initial )
{ {
mClickType = QQtClick; mClickType = QQtClick;
} }
@ -265,10 +273,38 @@ void QQtDoubleClickHelper::slotDoubleClickTimeout()
} }
void QQtDoubleClickHelper::checkClickNum() void QQtDoubleClickHelper::checkClickNumWithCancel()
{ {
QQtClickHelper::checkClickNum(); QQtClickHelper::checkClickNumWithCancel();
switch ( mClickType ) switch ( mClickType )
{
case QQtDoubleClick:
{
nDoubleClickNumWithCancel++;
if ( nDoubleClickNumWithCancel >= 0xFFFFFFFF )
{
p2debug() << "out......";
nDoubleClickNumWithCancel = 0;
}
}
break;
default:
break;
}
nTotalClickNumWithCancel = nClickNumWithCancel + nLongClickNumWithCancel + nDoubleClickNumWithCancel;
if ( nTotalClickNumWithCancel >= 0xFFFFFFFFFFFFFFFF )
{
p2debug() << "out......";
nTotalClickNumWithCancel = 0;
}
}
void QQtDoubleClickHelper::checkClickNum ( QQtClickType type )
{
QQtClickHelper::checkClickNum ( type );
switch ( type )
{ {
case QQtDoubleClick: case QQtDoubleClick:
{ {

View File

@ -66,7 +66,8 @@ public:
return mDoubleClickInterval; return mDoubleClickInterval;
} }
quint32 doubleClickNum() const { return nDoubleClickNum; } inline const quint32 doubleClickNum() const { return nDoubleClickNum; }
inline const quint32 doubleClickNumWithCancel() const { return nDoubleClickNumWithCancel; }
/** /**
* *
@ -97,20 +98,22 @@ protected:
QTime startClickTime; QTime startClickTime;
//double click检测用 //double click检测用
QTime t1_doubleclick; QTime prev_doubleclick;
QTime t2_doubleclick; QTime now_doubleclick;
//long click用 //long click用
QTime t2_release_preview; QTime prev_release;
QTime t2_release_initial; QTime now_release_initial;
//click 用 //click 用
QWidget* mUserWidget; QWidget* mUserWidget;
QQtMouseEvent* mMouseEvent; QQtMouseEvent* mMouseEvent;
//click num //click num
virtual void checkClickNum(); virtual void checkClickNumWithCancel();
virtual void checkClickNum ( QQtClickType type ) override;
quint32 nDoubleClickNum; quint32 nDoubleClickNum;
quint32 nDoubleClickNumWithCancel;
}; };
#endif // QQTDOUBLECLICKHELPER_H #endif // QQTDOUBLECLICKHELPER_H