在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>
似乎你不知道几个概念,所以我将解释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_())