2013-04-25 100 views
3

我已經在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中找不到這樣的功能。

+0

當用戶移動並保持觸摸屏幕邊緣時,它應該如何表現?旋轉器是否繼續移動? – UmNyobe 2013-04-25 13:29:49

+1

@ UmNyobe在觸摸屏設備上,如果他們到達屏幕邊緣,旋轉將不再移動。在非觸摸屏設備上,這個想法是他們永遠無法到達屏幕的邊緣。 – oggmonster 2013-04-25 13:35:19

回答

0

而是試圖迫使鼠標點擊位置的,你可以檢查,如果老鼠是在邊緣或邊緣之外,如果是,使用增量不斷增加(最後一步):

void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent) 
{ 
    QPoint DeltaPos; 
    if(!isInsideWindow(MouseEvent)) 
    { 
     DeltaPos = mPrevDeltaPos; 
    } 
    else 
    { 
     DeltaPos = MouseEvent->pos() - mPreviousPos; 
     mPrevDeltaPos = DeltaPos; 
     // Use DeltaPos to move my rotary 
     mPreviousPos = MouseEvent->pos(); 
    } 
} 

編輯:

另一種選擇是將計算在全球的鼠標DeltaPos基地的座標相對於窗口0而不是本地座標 - 因爲只有兩個鼠標座標是利益之間的差異,位置並不需要被連接到窗戶。在這種情況下,無論光標相對於窗框的位置如何,鼠標/手指的相同移動都會以相同的方式改變方向,窗口小部件將同時適用於觸摸和鼠標操作的屏幕。

+0

這不符合我的要求。無論實際的鼠標位置如何,旋轉器應該以與用戶相同的方式工作。由於光標處於隱藏狀態,用戶不知道它們位於邊緣,因此Rotary將以不同的方式開始工作,而無需通過解決方案向用戶提供任何反饋。 – oggmonster 2013-04-26 07:17:17

+0

是的,我必須同意你關於反饋的觀點。請參閱編輯。 – 2013-04-26 15:18:08