我已經在Qt中實現了旋轉控件。當用戶單擊旋轉時,鼠標光標被隱藏,向左/向下拖動鼠標可以逆時針旋轉旋鈕,向右/向上拖動鼠標可以順時針旋轉旋轉。當鼠標被釋放時,鼠標光標被設置爲點擊的原始位置。這樣執行:Qt鼠標控制觸摸和非觸摸設備上的旋轉器
void RotaryWidget::mousePressEvent(QMouseEvent *MouseEvent)
{
mMousePos = QCursor::pos();
mPreviousPos = MouseEvent->pos();
setCursor(Qt::BlankCursor);
}
void RotaryWidget::mouseReleaseEvent(QMouseEvent *MouseEvent)
{
QCursor::setPos(mMousePos);
unsetCursor();
}
void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
QPoint DeltaPos = MouseEvent->pos() - mPreviousPos;
// Use DeltaPos to move my rotary
mPreviousPos = MouseEvent->pos();
}
這樣做的好處是,當連續有幾個旋轉時,用戶可以更快地進行調整。
上面的代碼存在一個錯誤,因爲如果光標到達屏幕的邊緣,鼠標將無法移動,因此旋轉不能移動。但是,用戶看不到光標,所以這是一個問題。我改變mouseMoveEvent
解決它:
void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
if(MouseEvent->globalPos() == mMousePos)
{
mPreviousPos = mapFromGlobal(mMousePos);
return;
}
else
{
QCursor::setPos(mMousePos);
}
QPoint DeltaPos = MouseEvent->pos() - mPreviousPos;
// Use DeltaPos to move my rotary
mPreviousPos = MouseEvent->pos();
}
從本質上講,每次鼠標移動時,變化的計算方法,然後將光標設置回原來的按位置(所以它永遠不能關閉屏幕) 。頂部的if
確保我們不會將鼠標位置連續設置到原來的位置。
這適用於非觸摸屏設備,但在觸摸屏設備上,QCursor::setPos()
不起作用,因爲我無法以編程方式在屏幕上設置手指的位置!
我沒有想到滿足我所描述的所有要求的解決方案。如果有一種方法可以檢測用戶是否使用觸摸屏,它可能是固定的,但我在Qt中找不到這樣的功能。
當用戶移動並保持觸摸屏幕邊緣時,它應該如何表現?旋轉器是否繼續移動? – UmNyobe 2013-04-25 13:29:49
@ UmNyobe在觸摸屏設備上,如果他們到達屏幕邊緣,旋轉將不再移動。在非觸摸屏設備上,這個想法是他們永遠無法到達屏幕的邊緣。 – oggmonster 2013-04-25 13:35:19