pyqt QGraphicsView 以鼠標為中心進行縮放功能實現(xiàn)
更新時間:2024年10月08日 09:50:58 作者:你看我香不
在PyQt開發(fā)中,實現(xiàn)QGraphicsView的鼠標中心縮放功能需要注意初始化以及關鍵函數(shù)的重定義,遇到不達預期的效果時,可能需要重寫所有鼠標事件,本文記錄了解決QGraphicsView鼠標縮放問題的過程,供開發(fā)者參考
注意幾個關鍵點:
1. 初始化
class CustomGraphicsView(QGraphicsView):
def __init__(self, parent=None):
super(CustomGraphicsView, self).__init__(parent)
self.scene = QGraphicsScene()
self.setScene(self.scene)
self.setGeometry(0, 0, 1024, 600)
# 以下初始化代碼較為重要
self.setMouseTracking(True)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 按需開啟
# self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 按需開啟
self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)2. 關鍵實現(xiàn)函數(shù):重定義滾輪縮放事件(可能會達不到預期效果,請看步驟3或確認初始化)
def wheelEvent(self, event: QWheelEvent) -> None:
if event.modifiers() == Qt.ControlModifier:
mouse_pos = event.pos()
scene_pos = self.mapToScene(mouse_pos) #縮放前鼠標在scene的位置
s = 1.2 #按需調整
if(event.angleDelta().y() > 0):
self.scale(s,s)
else:
self.scale(1/s,1/s)
view_point = self.mapFromScene(scene_pos) #縮放后原scene進行映射新鼠標位置
self.verticalScrollBar().setValue(int(view_point.y()-mouse_pos.y())) #通過滾動條進行移動視圖
self.horizontalScrollBar().setValue(int(view_point.x()-mouse_pos.x()))
return
else:
return super().wheelEvent(event) # 保證滾動條能滾動3. 如果未到達預期效果,可能還需重寫所有鼠標事件:
def mousePressEvent(self, event: QMouseEvent) -> None:
if event.button() == Qt.LeftButton:
self.dragStartPos = event.pos() #用于鼠標拖拽視圖
returndef mouseReleaseEvent(self, event: QMouseEvent) -> None:
pass
returndef mouseMoveEvent(self, event):
if event.buttons() and Qt.LeftButton: # 實現(xiàn)鼠標拖拽視圖
newpos = event.pos()
delta = newpos - self.dragStartPos
self.dragStartPos = newpos
self.verticalScrollBar().setValue(self.verticalScrollBar().value() - delta.y())
self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - delta.x())
return僅此記錄,未重定義鼠標所有事件導致了近半個月的苦惱,雖然修復了但是仍不知道什么原因
到此這篇關于pyqt QGraphicsView 以鼠標為中心進行縮放的文章就介紹到這了,更多相關pyqt QGraphicsView 鼠標縮放內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用for循環(huán)遍歷字符串列表字典的操作流程
本文介紹了for循環(huán)遍歷字符串列表字典在Python中的重要性、應用場景、技術原理、實踐應用、常見問題及解決方案和最佳實踐等內容,旨在幫助讀者掌握for循環(huán)遍歷的基本用法和提高編程效率,需要的朋友可以參考下2026-05-05
分析解決Python中sqlalchemy數(shù)據(jù)庫連接池QueuePool異常
這篇文章主要來給大家分析sqlalchemy數(shù)據(jù)庫連接池QueuePool的異常,給大家用詳細的圖文方式做出了解決的方案,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09

