我的应用程序使用的是Qt。
我有一个类,它继承了 QGraphicsPixmapItem.
当对这些项进行变换时(例如,旋转),项的原点(或枢轴点)总是左上角。
我想改变这个原点,例如,当设置项目的位置时,这将改变像素图的中心。
或者,如果我在应用旋转,旋转的原点将是像素图的中心。
我还没有找到一种直接用Qt来实现的方法,所以我想重新实现了 itemChange() 像这样。
QVariant JGraphicsPixmapItem::itemChange(GraphicsItemChange Change, const QVariant& rValue)
{
switch (Change)
{
case QGraphicsItem::ItemPositionHasChanged:
// Emulate a pivot point in the center of the image
this->translate(this->boundingRect().width() / 2,
this->boundingRect().height() / 2);
break;
case QGraphicsItem::ItemTransformHasChanged:
break;
}
return QGraphicsItem::itemChange(Change, rValue);
}
我认为这将工作,因为 文档 提到一个项目的位置和它的变换矩阵是两个不同的概念。
但它没有工作。
有什么办法吗?
你想多了。QGraphicsPixmapItem已经内置了这个功能。请看 设置偏移 方法。
因此,要将项目的原点设置在其中心,只需执行 setOffset( -0.5 * QPointF( width(), height() ) );
每次设置像素图的时候。
void QGraphicsItem::rotate ( qreal angle )
围绕原点顺时针旋转当前项目的变换角度。要围绕一个任意的点(x,y)进行平移,您需要将平移和旋转结合起来使用
setTransform()
.例子:你需要创建一个rotate函数,即把对象转换到父节点(0,0)的角上做旋转并把对象移动到原来的位置。
// Rotate an item 45 degrees around (0, 0). item->rotate(45); // Rotate an item 45 degrees around (x, y). item->setTransform(QTransform().translate(x, y).rotate(45).translate(-x, -y));
你需要创建一个旋转函数,将对象转换到父体的(0,0)角做旋转并将对象移动到原来的位置。