QGraphicsItem:模拟不是左上角的项目原点

时间:2009-05-25 14:42:05

标签: qt qt4

我的应用程序正在使用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提到项目的位置及其变换矩阵是两个不同的概念。

但它没有用。

有什么想法吗?

3 个答案:

答案 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)角进行旋转并将对象移动到原始位置。