1.概述
在做客戶端UI程序時,鼠標右鍵彈出菜單這種操作非常常見,一般在鼠標右鍵按下或者鼠標右鍵抬起事件中響應操作,顯示菜單即可,但是有時涉及到鼠標的移動,就是鼠標按下右鍵且移動時,則不需要彈出菜單,其它時候正常彈出。這種情況有很多種實現方式,但是操作體驗上,差別較大,下面記錄一種實現方案
2.實現方案
目標:實現流暢的鼠標右鍵彈出菜單操作,當鼠標右鍵按下且移動時,不彈出菜單
2.1 實現思路
開啟一個定時器 timer(設置定時器觸發超時200ms,設置定時器超時響應函數RightClickFun,函數中設置右鍵彈窗標識 boolFlag為false),在鼠標右鍵按下時啟動定時器,并設置一個右鍵彈窗標識 boolFlag為true,在鼠標右鍵彈起時,如果右鍵彈窗標識 boolFlag為true則停止定時器并顯示右鍵彈窗,否則不顯示彈窗。大致意思就是如果鼠標右鍵按下超過200ms,則判定為其它操作,不彈窗,小于200ms則彈窗。
2.2 QT實現示例
此處以c++ QT做一個簡單的示例,其它的UI界面庫原理是一樣的
Qtimer* m_rClickTimer=new QTimer(this);
m_rClickTimer->setSingleSlot(true);
connect(m_rClickTimer,SIGNAL(timeout()),this,SLOT(OnRightClick()));//鼠標按鍵按下事件響應
void TestWidget::mousePressEvent(QMouseEvent *event)
{if(event->button == Qt::RightButton){ m_rClickTimer->start(200);m_rFlag=true;}
}//鼠標按鍵抬起事件響應
void TestWidget::mouseReleaseEvent(QMouseEvent *event)
{if(event->button == Qt::RightButton){if(m_rFlag){m_rightPopMenu->move(QCursor::pos);m_rightPopMenu->show();} }
}//定時器超時響應函數
void TestWidget::TestWidget()
{m_rFlag=false;
}