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 子项不再单击鼠标?
QGraphicsView 和 QGraphicsItem:缩放视图矩形时不要缩放项目