Python PyQt5 QGraphicsView捕捉轮事件

Python PyQt5 QGraphicsView捕捉轮事件,python,pyqt5,qgraphicsview,Python,Pyqt5,Qgraphicsview,在python中,我使用QDesigner构建了一个带有QGraphicsView的.ui文件 在Python脚本中,我现在想捕捉在小部件中使用鼠标滚轮的情况。但是,脚本不会捕获事件 有什么帮助吗 class Klassenname(QMainWindow): def __init__(self, *args): super(Klassenname, self).__init__() self.UI = loadUi(self.gui) s

在python中,我使用QDesigner构建了一个带有QGraphicsView的.ui文件

在Python脚本中,我现在想捕捉在小部件中使用鼠标滚轮的情况。但是,脚本不会捕获事件

有什么帮助吗

class Klassenname(QMainWindow):
    def __init__(self, *args):
        super(Klassenname, self).__init__()
        self.UI = loadUi(self.gui)
        self.update()  # Calling the update function

    def wheelEvent(self, event):
        self.UI.graphicsView.wheelEvent(self, event)  # self.UI.graphicsView is the widget
        if event.angleDelta().y() > 0:
            self.zoomIn()  # function for zooming in 
        else:
            self.zoomOut()  # function for zooming out


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Klassenname()
    win.UI.show()
    sys.exit(app.exec_())
.ui文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QGraphicsView" name="graphicsView">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>10</y>
      <width>781</width>
      <height>561</height>
     </rect>
    </property>
   </widget>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

主窗口
0
0
800
600
主窗口
10
10
781
561

您似乎不知道几个概念,因此我将解释loadUi的作用,如果您不向其传递第二个参数,则将创建一个新窗口(在您的示例中为“self.UI”),该窗口与“win”不同,因此控制盘事件不会发生。它将从“self.UI”传输到“win”,因此不会调用“win”的wheelEvent方法

因此,首先必须将“Klassename”设置为显示窗口,为此,必须传递“self”

考虑到上述情况,解决方案是:

导入系统 从PyQt5导入QtCore、QtWidgets、uic 类Klassenname(QtWidgets.QMainWindow): def uuu init uuu(self,parent=None): 超级(Klassename,self)。\uuuu初始(父级) uic.loadUi(“/path/of/your_file.ui”,self) def wheelEvent(自我,事件): 如果event.angleDelta().y()大于0: self.zoomIn() 其他: self.zoomOut() 返回超级(Klassename,self).wheelEvent(事件) 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) win=Klassename() win.show() sys.exit(app.exec_()) 使用该代码,您将收听接收“Klassename”的鼠标滚轮的事件,但如果您只想收听QGraphicsView的鼠标事件,则必须使用事件过滤器:

导入系统 从PyQt5导入QtCore、QtWidgets、uic 类Klassenname(QtWidgets.QMainWindow): def uuu init uuu(self,parent=None): 超级(Klassename,self)。\uuuu初始(父级) uic.loadUi(“/path/of/your_file.ui”,self) self.graphicsView.installEventFilter(self) def事件过滤器(自身、obj、事件): 如果obj是self.graphicsView和event.type()==QtCore.QEvent.Wheel: 如果event.angleDelta().y()大于0: self.zoomIn() 其他: self.zoomOut() return super(klassename,self).eventFilter(obj,event) 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) win=Klassename() win.show() sys.exit(app.exec_())
share the.ui….用.ui文件更新了问题当我们在处理时,这里有一些更好的逻辑(尽管是C++)来处理图形视图中的控制盘事件:
auto-anchor=transformationAnchor();setTransformationAnchor(AnchorUnderMouse);自动角度=事件->角度增量();qreal系数=标准::功率(1.2,角度/240.0);尺度(因子,因子);设置转换锚(锚)
@ypnos这个问题只想检测鼠标滚轮事件,从那里你想如何使用这些信息是另一个故事,我的回答没有涉及到。@eyllanesc非常感谢,它起作用了。然而,当放大时,如果鼠标滚轮转到另一个方向,它会移动内容,直到它到达png的底部边缘,然后再次向外滚动。@eyllanesc我只是想提供一些代码,可能是这个问题的典型后续问题:如何按照用户通常的期望在图形视图中使用鼠标滚轮进行缩放。根本不是对你的答案的批评。@user12523066问题很具体:QGraphicsView抓轮事件,所以我只回答这个问题,如果你有其他问题,那么首先调查,如果你仍然没有发现问题,那么创建一个新问题来解释你的研究并展示你的尝试。