旋转+翻译?

时间:2013-12-16 10:01:40

标签: qt pyqt4 qt4.8

我有一个矩形图像(即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:我忘了提到新中心的坐标是基于原始图像的坐标,而不是基于旋转图像的坐标。

2 个答案:

答案 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设置画家坐标系的转换。