Python PyQt5 QGraphicsView catch wheel 事件。

问题描述 投票:0回答:1

在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>
python pyqt5 qgraphicsview
1个回答
2
投票

似乎你不知道几个概念,所以我将解释loadUi的作用,如果你不给它传递第二个参数,那么将创建一个新的窗口(在你的例子中是 "self.UI"),它不同于 "win",所以滚轮事件不会被从 "self.UI "转移到 "win",所以 "win "的wheelEvent方法不会被调用。

所以首先你必须让 "Klassenname "成为显示的窗口,为此你必须传递 "self"。

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

import sys
from PyQt5 import QtCore, QtWidgets, uic


class Klassenname(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Klassenname, self).__init__(parent)
        uic.loadUi("/path/of/your_file.ui", self)

    def wheelEvent(self, event):
        if event.angleDelta().y() > 0:
            self.zoomIn()
        else:
            self.zoomOut()
        return super(Klassenname, self).wheelEvent(event)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    win = Klassenname()
    win.show()
    sys.exit(app.exec_())

通过这段代码,你可以监听接收 "Klassenname "的鼠标滚轮事件 但如果你只想监听QGraphicsView的鼠标事件 那你就必须使用一个eventFilter:

import sys
from PyQt5 import QtCore, QtWidgets, uic


class Klassenname(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Klassenname, self).__init__(parent)
        uic.loadUi("/path/of/your_file.ui", self)
        self.graphicsView.installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj is self.graphicsView and event.type() == QtCore.QEvent.Wheel:
            if event.angleDelta().y() > 0:
                self.zoomIn()
            else:
                self.zoomOut()
        return super(Klassenname, self).eventFilter(obj, event)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    win = Klassenname()
    win.show()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.