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:
parent
33de3a1580
commit
88da5a3891
@ -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 );
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user