我的应用程序正在使用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);
}
我认为这会有效,因为Qt's doc提到项目的位置及其变换矩阵是两个不同的概念。
但它没有用。
有什么想法吗?
答案 0 :(得分:4)
你是在思考它。 QGraphicsPixmapItem已经内置了此功能。请参阅setOffset方法。
因此,要将项目原点设置在其中心,只需在每次设置像素图时执行setOffset( -0.5 * QPointF( width(), height() ) );
。
答案 1 :(得分:2)
The Qt-documentation about rotating:
void QGraphicsItem :: rotate(qreal angle)
旋转当前项目 顺时针转换角度 围绕它的起源。 翻译 你需要一个任意点(x,y) 结合翻译和旋转
setTransform()
的示例:
// 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));
答案 2 :(得分:-1)
您需要创建一个旋转功能,将对象转换为父对象(0,0)角进行旋转并将对象移动到原始位置。