我有一个矩形图像(即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 :(得分:1)
您应该在旋转之前执行平移(QTransform
修改坐标系统。)
例如: def paintEvent(self,event): 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()
答案 1 :(得分: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
设置画家坐标系的转换。