3

我只想通过小部件的轴移动图像并围绕小部件的中心旋转(就像任何数字绘画软件中的画布),但它围绕其左顶点旋转......

QPainter p(this);
QTransform trans; 

trans.translate(width()/2, -height()/2);
trans.rotate(angle); 

QTransform inverse = trans.inverted();
inverse.translate(-canvas.width()/2, -canvas.height()/2); 

p.setTransform(trans);
p.drawImage(inverse.map(canvasPos), canvas);

如何让它正确旋转?

4

2 回答 2

4

您可以将图像的初始居中、最终结果在小部件中心的旋转和居中组合在一个转换中。

上的操作QTransform以相反的顺序完成,因为最后一个应用于QTransform图像将是第一个应用于图像:

// QImage canvas;
QPainter p(this);
QTransform trans; 

// Move to the center of the widget
trans.translate(width()/2, height()/2);

// Do the rotation
trans.rotate(angle); 

// Move to the center of the image
trans.translate(-canvas.width()/2, -canvas.height()/2); 

p.setTransform(trans);
// Draw the image at (0,0), because everything is already handled by the transformation
p.drawImage(QPoint(0,0), canvas);
于 2013-05-16T13:05:52.227 回答
2

对象围绕其左上角而不是其中心旋转的通常原因是因为它的尺寸定义为左上角的 0,0,而不是位于对象的中心。

您还没有显示“画布”对象是什么,因此假设它类似于 QGraphicsRectItem,您需要将其左上角、宽度、高度声明为 -x/2、-y/2、宽度、高度以确保物体的中心点在 0,0。然后,当您旋转对象时,它将围绕其中心旋转。

此外,您应该尝试将旋转和平移逻辑与绘画功能分开以获得最佳性能。

于 2013-05-16T12:47:57.753 回答