QGraphicsItem : 模拟一个非左上角的项目原点。

问题描述 投票:5回答:3

我的应用程序使用的是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 qgraphicsitem qgraphicspixmapitem
3个回答
5
投票

你想多了。QGraphicsPixmapItem已经内置了这个功能。请看 设置偏移 方法。

因此,要将项目的原点设置在其中心,只需执行 setOffset( -0.5 * QPointF( width(), height() ) ); 每次设置像素图的时候。


2
投票

关于旋转的Qt文档:

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));

-1
投票

你需要创建一个旋转函数,将对象转换到父体的(0,0)角做旋转并将对象移动到原来的位置。

© www.soinside.com 2019 - 2024. All rights reserved.