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

Posted

技术标签:

【中文标题】QGraphicsItem :模拟不是左上角的项目原点【英文标题】:QGraphicsItem : emulating an item origin which is not the top left corner 【发布时间】:2009-05-25 14:42:04 【问题描述】:

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

但它不起作用。

有什么想法吗?

【问题讨论】:

【参考方案1】:

你想多了。 QGraphicsPixmapItem 已经内置了这个功能。参见setOffset 方法。

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

【讨论】:

你是完全正确的:我没有看到这个偏移属性。这正是我所需要的。我的应用程序现在按预期工作。谢谢!【参考方案2】:

The Qt-documentation about rotating:

void QGraphicsItem::rotate (qreal 角度)

旋转当前项目 顺时针变换角度度数 围绕它的起源。 左右翻译 任意点 (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));

【讨论】:

我实际上是在文档中找到的,但我没有在我的问题中提到我想使用 QGraphicsItemAnimation,它没有 setTransformAt() 方法,只有 setPosAt、setRotationAt 等。 【参考方案3】:

您需要创建一个旋转函数,将对象平移到父级的 (0, 0) 角进行旋转并将对象移动到原始位置。

【讨论】:

以上是关于QGraphicsItem :模拟不是左上角的项目原点的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsItem绘制问题

如果选择该项目,为啥 QGraphicsItem 子项不再单击鼠标?

QGraphicsView 和 QGraphicsItem:缩放视图矩形时不要缩放项目

将鼠标事件从 QGraphicsItem 传递给 QGraphicsScene

未调用 QGraphicsItem 绘制

如何在 QGraphicsView 中执行 QGraphicsItem(s) 的交换?