2013-11-21 78 views
3

我實現了一個圖像瀏覽器,我使用鼠標滾輪事件顯示下一個圖像。問題是,如果用戶滾動快速,滾輪的位置值跳過併吞下兩者之間的值。有誰知道我能如何克服這個問題?這是一個示例代碼。如果我慢慢滾動,我會得到遞減值-1,-2,-3;如果我快速滾動,我會得到像-1,-5,-6,-11這樣的東西。問題出現在WindowsXP中& 7.Pyqt Wheel事件

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys 

#############Define MyWindow Class Here ############ 
class MyWindow(QMainWindow): 
##----------------------------------------- 
    def __init__(self): 
    QMainWindow.__init__(self) 
    self.label = QLabel("No data") 
    self.label.setGeometry(100, 200, 100, 100) 
    self.setCentralWidget(self.label) 
    self.setWindowTitle("QMainWindow WheelEvent") 
    self.x = 0 
##----------------------------------------- 
    def wheelEvent(self,event): 
    self.x =self.x + event.delta()/120 
    print self.x 
    self.label.setText("Total Steps: "+QString.number(self.x)) 
##----------------------------------------- 
##########End of Class Definition ################## 


def main(): 
    app = QApplication(sys.argv) 
    window = MyWindow() 
    window.show() 
    return app.exec_() 

if __name__ == '__main__': 
main() 
+0

你在用什麼樣的鼠標?輪子是「點擊」還是「平滑」? event.delta()的值是否保持不變?我的鼠標滾輪是「clicky」,三角洲是一個常數±120單位。 – ekhumoro

+0

礦井有點光滑,價值不保持不變。如果我快速滾動120步,例如120120240360。 – snowflake

回答

5

似乎沒有在這裏的任何問題,因爲Qt是正確報告的通過鼠標滾輪滾動的單位數。

某些鼠標驅動程序支持加速滾動,這意味着滾輪旋轉更快時滾動單元的數量會逐漸增加。單位爲0.125度,大多數小鼠的基線滾動速度爲每個「缺口」120個單位。當車輪旋轉得更快時(即120,240,360等),加速只是將基線速度乘以增加的因子。

所以在QWheelEvent,滾動「缺口」的數量由計算:

event.delta() // baseline_speed 

這也正是在這個問題的示例代碼已經這樣做。

如果要單獨值寄存器每一個「缺口/步」,你可以只使用一個循環:

steps = event.delta() // 120 
    vector = steps and steps // abs(steps) # 0, 1, or -1 
    for step in range(1, abs(steps) + 1): 
     self.x += vector 
     print(self.x) 

或者你可以不理會加速,而只登記爲每個車輪事件向量:

delta = event.delta() 
    self.x += (delta and delta // abs(delta)) 
    print(self.x) 
+0

謝謝你這個偉大的答案! – snowflake

+2

基本上仍然如此,即使event.delta()已被棄用,我們現在有pixelDelta()或angleDelta()。 – mnagel