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 )
{
// if ( mClickHelper )
// mClickHelper->mousePressEvent ( event, this );
if ( mClickHelper )
mClickHelper->mousePressEvent ( event, this );
return QQtWidget::mousePressEvent ( event );
}

View File

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

View File

@ -55,9 +55,13 @@ public:
void setLongClickInterval ( int millSecond = longClickInterval );
int getLongClickInterval() const;
quint32 clickNum() const;
quint32 longClickNum() const;
quint64 totalClickNum() const;
inline const quint32 clickNum() const { return nClickNum; }
inline const quint32 longClickNum() const { return nLongClickNum; }
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;
//click 检测使用
QTime t1_press;//press relase
QTime t2_release;//release
QTime now_press;//press relase
QTime now_release;//release
//click num
virtual void checkClickNum();
virtual void checkClickNumWithCancel();
virtual void checkClickNum ( QQtClickType type );
quint32 nClickNum;
quint32 nLongClickNum;
quint64 nTotalClickNum;
quint32 nClickNumWithCancel;
quint32 nLongClickNumWithCancel;
quint64 nTotalClickNumWithCancel;
};
#endif // QQTCLICKHELPER_H

View File

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

View File

@ -66,7 +66,8 @@ public:
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;
//double click检测用
QTime t1_doubleclick;
QTime t2_doubleclick;
QTime prev_doubleclick;
QTime now_doubleclick;
//long click用
QTime t2_release_preview;
QTime t2_release_initial;
QTime prev_release;
QTime now_release_initial;
//click 用
QWidget* mUserWidget;
QQtMouseEvent* mMouseEvent;
//click num
virtual void checkClickNum();
virtual void checkClickNumWithCancel();
virtual void checkClickNum ( QQtClickType type ) override;
quint32 nDoubleClickNum;
quint32 nDoubleClickNumWithCancel;
};
#endif // QQTDOUBLECLICKHELPER_H