2014-11-06 1 views
2

QGraphics 변환 행렬로 화면 이동 및 확대/축소를 시도하고 있습니다. 확대/축소는 작동하지만 팬 매개 변수 m31 및 m32는 효과가 없습니다. 장면을 중앙에 배치하는 또 다른 기능이있는 것처럼 보입니다. 아래 코드에서 rectScene을 조작하여 Pan을 수행하지만 m31과 m32를 Pan으로 사용할 수없는 이유는 무엇입니까? (이보기에 모든 것을 수학적 관점에서 내 질문에PyQt QGraphicsView 변환 행을 사용하여 화면 이동 및 확대

'''Pan (left mouse but) and zoom (mouse wheel) test''' 
'''Python 3.4 (No differance between PyQt4 and PyQt5)''' 
#from PyQt5 import QtGui, QtCore 
#import PyQt5.QtWidget as QW    
from PyQt4 import QtGui, QtCore 
import PyQt4.QtGui as QW    

import numpy as np       

class ZoomAndPan(QW.QGraphicsView): 

    def __init__(self,parent=None): 
     super(ZoomAndPan,self).__init__(parent) 
     self.setWindowTitle('ZoomAndPan') 
     self.setGeometry(600,300,600,400) 
     'Left button in top of image. Shows the transform matrix (press to reset)' 
     self.mess = QW.QPushButton('Transform Matrix\n\n\ndx,xy\ncounter', self) 
     self.mess.clicked.connect(self.resetM) 

     'm31 button, adds 200 to m31' 
     self.m31 = QW.QPushButton('m31', self) 
     self.m31.move(200,0) 
     self.m31.clicked.connect(self.addM31) 

     'm13 button, adds 0.0001 to m13' 
     self.m13 = QW.QPushButton('m13', self) 
     self.m13.move(300,0) 
     self.m13.clicked.connect(self.addM13) 
     self.count=0 #Counter  

     # Create scene 
     self.sc=scene(self,self) 
     self.setScene(self.sc) 

    def mouseMoveEvent(self,event): 
     'Pan by manipulting sceneRect' 
     pos=event.pos() 
     pos=self.mapToScene(pos)  
     dx=pos.x()-self.sc.startPos.x() 
     dy=pos.y()-self.sc.startPos.y() 

     rect=self.sceneRect().getRect() 
     self.setSceneRect(rect[0]-dx,rect[1]-dy,rect[2],rect[3])   
     # Increas counter to show that the loop works 
     self.count+=1 
     self.showMatrix() 

    def showMatrix(self): 
     'Show matrix in Textbox (Buttton)' 
     m=self.transform() 
     str1='{0:5.2f}{1:5.2f} {2:6.4f}\n'.format(m.m11(), m.m12(),m.m13()) 
     str2='{0:5.2f}{1:5.2f}{2:5.2f}\n'.format(m.m21(), m.m22(),m.m23()) 
     str3='{0:5.2f}{1:5.2f}{2:5.2f}\n'.format(m.m31(), m.m32(),m.m33()) 
     str4='{0:5.2f}{1:5.2f}\n'.format(m.dx(), m.dy(),m.m33()) 
     'Show counter ' 
     str5='{0:5.0f}'.format(self.count)   
     self.mess.setText(str1+str2+str3+str4+str5) 

    def resetM(self): 
     'Reset transform' 
     self.resetTransform() 
     self.showMatrix() 

    def addM31(self): 
     'Add 200 to m31 ' 
     m=self.transform() 
     m.setMatrix(m.m11(),m.m12(),m.m13(),m.m21(),m.m22(),m.m23(),m.m31()+200,m.m32(),m.m33()) 
     self.setTransform(m)  
     self.showMatrix() 

    def addM13(self): 
     'Add 0.0001 to m13 ' 
     m=self.transform() 
     m.setMatrix(m.m11(),m.m12(),m.m13()+0.0001,m.m21(),m.m22(),m.m23(), 
      m.m31(),m.m32(),m.m33()) 
     self.setTransform(m)  
     self.showMatrix()   

class scene(QW.QGraphicsScene): 
    def __init__(self,parent,myView=[]): 
     QW.QGraphicsScene.__init__(self,parent) 
     self.myView=myView   
     # Some items in scene 
     self.txt=self.addSimpleText("///////") 
     self.txt.setPos(2,-20) 
     self.txt.setScale(2) 
     self.txt.setBrush(QtGui.QBrush(QtCore.Qt.green)) 
     self.addRect(0,16,20,20, pen=QtGui.QPen(QtCore.Qt.blue)) 
     self.addRect(10,60,32,8, pen=QtGui.QPen(QtCore.Qt.red)) 
     self.addRect(30,16,20,20, pen=QtGui.QPen(QtCore.Qt.blue)) 
     self.N=0 

    def mousePressEvent(self, event):  
     self.myView.setDragMode(1) # Works fine without this 
     self.startPos=event.scenePos()   

    def mouseReleaseEvent(self, event):  
     self.myView.setDragMode(0) 

    def wheelEvent(self, event): 
     'zoom' 
     sc=event.delta()/100 
     if sc<0: sc=-1/sc 
     self.myView.scale(sc,sc) 
     self.myView.setDragMode(0) 
     self.myView.showMatrix()   

def main(): 
    app = QW.QApplication([]) 
    fig=ZoomAndPan() 
    fig.show(); 
    app.exec_() 


if __name__=='__main__': 
    main() 

답변

0

이다는 잘 작동 QGraphicsViewalignment property에 따라 뷰를 중심으로하기 때문에 더 변화를 볼 이유는

Qt docs에서 :..

QGraphicsView는 QTransform을 사용하여 아핀 변환을 지원하며 setTransform()에 행렬을 전달하거나 rotate(), scale(), translate() 또는 shear() 함수 중 하나를 호출 할 수 있습니다. 두 가지 일반적인 변환 ns는 확대/축소 및 회전을 구현하는 데 사용되는 배율입니다. QGraphicsView는 변환하는 동안 뷰의 중심을 고정시킵니다. 장면 정렬 (setAligment())으로 인해 뷰를 변환해도 시각적 인 영향은 없습니다.

+0

확인 Qt doc을 확인했습니다. 가운데, 위, 아래, 왼쪽 또는 오른쪽으로 정렬을 설정할 수 있습니다. 이 기능을 끌 수 있습니까? 아니면 기능을 무시할 수 있습니까? –

관련 문제