Python PyQt5 QGraphicsView捕捉轮事件
在python中,我使用QDesigner构建了一个带有QGraphicsView的.ui文件 在Python脚本中,我现在想捕捉在小部件中使用鼠标滚轮的情况。但是,脚本不会捕获事件 有什么帮助吗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
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抓轮事件,所以我只回答这个问题,如果你有其他问题,那么首先调查,如果你仍然没有发现问题,那么创建一个新问题来解释你的研究并展示你的尝试。