Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyqt车轮事件_Python_Windows_Events_Pyqt_Mousewheel - Fatal编程技术网

Python Pyqt车轮事件

Python Pyqt车轮事件,python,windows,events,pyqt,mousewheel,Python,Windows,Events,Pyqt,Mousewheel,我实现了一个图像浏览器,在那里我使用鼠标的滚轮事件来显示下一个图像。问题是,如果用户滚动过快,滚轮的位置值将跳过并吞没介于两者之间的值。有人知道我如何克服这个问题吗?如果我慢慢滚动,就会得到一个递减值(-1,-2,-3);如果我快速滚动,会得到类似(-1,-5,-6,-11)的结果。问题出现在WindowsXP&7上 下面是一个示例代码 from PyQt4.QtCore import * from PyQt4.QtGui import * import sys #############De

我实现了一个图像浏览器,在那里我使用鼠标的滚轮事件来显示下一个图像。问题是,如果用户滚动过快,滚轮的位置值将跳过并吞没介于两者之间的值。有人知道我如何克服这个问题吗?如果我慢慢滚动,就会得到一个递减值(-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()

这里似乎没有任何问题,因为Qt正确地报告了鼠标滚轮滚动的单位数

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

因此,在a中,滚动的“槽口”数量通过以下公式计算:

    # 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)

你用的是什么样的鼠标?轮子是“咔嗒”的还是“光滑的”?
event.delta()
的值是否保持不变?我的鼠标滚轮是“clicky”,delta是一个常数±120个单位。我的鼠标滚轮有点平滑,数值不会保持不变。如果我快速滚动,它会以120个步骤移动,例如120240360。谢谢你的回答!基本上仍然正确,即使event.delta()已被弃用,并且我们现在有pixelDelta()或angleDelta()。