Python PyQt5 QGraphicsView событие захвата колеса - PullRequest
0 голосов
/ 02 мая 2020

В python Я создал файл .ui с QGraphicsView, используя QDesigner.

В скрипте 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>

1 Ответ

2 голосов
/ 02 мая 2020

Похоже, вы не знаете нескольких концепций, поэтому я объясню, что делает loadUi, если вы не передадите ему второй аргумент, то будет создано новое окно (в вашем случае «self.UI»), отличное от "win", поэтому событие wheel не переносится из "self.UI" в "win", поэтому метод "win" wheelEvent не вызывается.

Итак, сначала вы должны сделать "Klassenname" отображаемое окно и для этого вы должны передать «Я».

Учитывая вышеизложенное, решение:

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_())
...