2013-12-16 207 views
0

我有一個矩形圖像(即1280 x 1024),需要圍繞其中心點旋轉,然後轉換爲給定點。旋轉+翻譯?

在一個小部件的paintEvent方法,這就是我做的:

def paintEvent(self, event): 
    # self._center are the coordinates where I want to set the rotated image's center. 

    t = QtGui.QTransform() 
    s = self._pm.size() # self._pm is the image to rotate. 
    t.translate(s.width()/2, s.height()/2) 
    t.rotate(self._degrees) 
    t.translate(-s.width()/2, -s.height()/2) 

    # now my image is properly rotated. Now I need to translate it to the final 
    # coordinates. 

    t.translate (self._center.x, self._center.y) 

    p = QtGui.QPainter(self) 
    p.setTransform(t) 
    p.drawPixmap(0, 0, self._pm) 
    p.end() 

這很好輪換。問題是,我不能找到一種方法,用一個新的中心,以顯示我的形象,它只有self._degrees爲0

如果我申請的另一個translate到QTransform對象,self._degrees不爲0的作品,形象是永遠集中在我期望的地方。

請問有人能指點我正確的方向嗎?

編輯
PS:我忘了提,新中心的座標是基於原始圖像的座標,而不是旋轉的圖像的人。

+0

解釋:「F I應用另一種形式轉換爲QTransform對象和自我。 _degrees不是0,圖像永遠不會集中在我期望的位置。「我猜你很快就會應用這個轉換。顯示有問題的轉換代碼。 –

+0

@MarekR謝謝你,看我最近的編輯。 – Simone

回答

0

如果我理解正確self._center包含旋轉中心應放置的位置的信息。在這種情況下,它是做的相當簡單:

def paintEvent(self, event): 
    t = QtGui.QTransform() 
    s = self._pm.size() # self._pm is the image to rotate. 
    t.translate(-self._center.x, -self._center.y) 
    t.rotate(self._degrees) 
    t.translate(self._center.x, self._center.y) 

    p = QtGui.QPainter(self) 
    p.setTransform(t) 
    p.drawPixmap(0, 0, self._pm) 
    p.end() 

記住畫家是setTransform組變換座標系。

+0

並非如此:旋轉中心是原始圖像的中心。一旦圖像旋轉,我需要將其翻譯到不同的中心,其座標是self._center。 – Simone

1

您應該在旋轉之前執行翻譯(一個QTransform修改座標系統)。

例如: DEF的paintEvent(個體,事件): RECT =查閱QRect(0,0,20,10)

self._center = QPoint(50, 50) 

t = QTransform() 
#Do not forget to substract the rect size to center it on self._center 
t.translate (self._center.x() -rect.width()/2, self._center.y() -rect.height()/2) 

t.translate(rect.width()/2, rect.height()/2) 
t.rotate(45.0) 
t.translate(-rect.width()/2, -rect.height()/2) 

p = QPainter(self) 
p.save() 

#Paint original rect 
p.setBrush(QBrush(Qt.black)) 
p.drawRect(rect) 

# Paint rect with transformation 
p.setTransform(t) 
p.setBrush(QBrush(Qt.red)) 
p.drawRect(rect) 

# Paint self._center 
p.restore() 
p.setPen(QPen(Qt.black, 5)) 
p.drawPoint(self._center) 

p.end()