Pyqt的滚轮事件

7
我实现了一个图片浏览器,其中使用鼠标的滚轮事件显示下一张图片。问题是,如果用户滚动太快,滚轮的位置值会跳过并吞噬中间的值。有人知道如何解决这个问题吗?如果我慢慢滚动,我会得到一个递减的值(-1、-2、-3);如果我快速滚动,我会得到像(-1、-5、-6、-11)这样的值。该问题出现在WindowsXP和7上。
以下是示例代码。
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()

你使用的是什么类型的鼠标?滚轮是“发嗒声”的还是“平滑”的?event.delta()的值是否保持不变?我的鼠标滚轮是“发嗒声”的,并且delta是一个恒定的±120单位。 - ekhumoro
我的滚动有点平滑,值不会保持恒定。如果我快速滚动,它会以120的步长增加,例如120、120、240、360。 - honeymoon
1个回答

10

看起来这里没有任何问题,因为Qt正确报告了鼠标滚轮滚动的单位数。

一些鼠标驱动程序支持加速滚动,这意味着当滚轮旋转得更快时,报告的滚动单位数量会逐渐增加。这些单位是0.125度,并且大多数鼠标的基线滚动速度为每个“凸轮”120个单位。加速只是将基线速度乘以一个逐渐增加的因子,随着滚轮旋转得更快而增加(即120、240、360等)。

因此,在QWheelEvent中,计算滚动的“凸轮”数量是通过以下方式进行的:

    # PyQt5/PySide2
    event.angleDelta().y() // baseline_speed

    # PyQt4/PySide
    event.delta() // baseline_speed 

这正是问题中示例代码的所做的。

如果您想单独注册每个“刻度/步骤”,您可以使用一个循环:

    steps = event.angleDelta().y() // 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.angleDelta().y()
    self.x += (delta and delta // abs(delta))
    print(self.x)

谢谢您这个很棒的回答! - honeymoon
3
基本上仍然是正确的,即使 event.delta() 已被弃用,现在有 pixelDelta() 或 angleDelta()。 - mnagel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接