相对于文本中心移动`QGraphicsTextItem`位置?
Shift `QGraphicsTextItem` position relative to the center of the text?
我有一些 类 继承自 QGraphicsItem
,它们可以按特定方式排列。为了简化计算,我制作了场景和项目,以 (0, 0) 为中心(boundingRect()
具有 +/- 坐标)。
QGraphicsTextItem
子类违背我的意思,它的 pos()
是相对于左上角的点。
我尝试了很多方法来移动它,使其位于文本中心(例如,建议的解决方案 here - 引用的代码实际上剪切了我的文本,只显示了左下角) .
我想解决方案应该很简单,比如
void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
painter->translate( -boundingRect().width()/2.0, -boundingRect().height()/2.0 );
QGraphicsTextItem::paint(painter, option, widget );
}
以上 "sort of" 有效 - 但是当我增加项目比例 -> 增加字体时,显示的项目被截断...
我尝试设置 pos()
- 但问题是,我仍然需要跟踪场景中的实际位置,所以我不能直接替换它。
一个稍微令人不快的副作用 - 使 QGraphicsView
在元素上居中也不起作用。
如何让我的 QGraphicsTextItem
显示其相对于文本中心的位置?
编辑: 改变boundingRect()
的实验之一:
QRectF TextItem::boundingRect() const
{
QRectF rect = QGraphicsTextItem::boundingRect();
rect.translate(QPointF(-rect.width()/2.0, -rect.height()/2.0));
return rect;
}
我不得不改变初始位置以及调整大小以触发新位置 - 我无法在 paint() 中执行此操作,因为正如我从一开始就认为的那样,任何重绘都会不断地重新计算位置。
只需要调整初始位置-但是随着字体大小(或样式...)的变化,其边界矩形也会发生变化,因此必须重新计算位置-基于之前的位置。
在构造函数中,
setPos(- boundingRect().width()/2, - boundingRect().height()/2);
在修改项目(字体)大小的函数中,
void TextItem::setSize(int s)
{
QRectF oldRect = boundingRect();
QFont f;
f.setPointSize(s);
setFont(f);
if(m_scale != s)
{
m_scale = s;
qreal x = pos().x() - boundingRect().width()/2.0 + oldRect.width()/2.0;
qreal y = pos().y() - boundingRect().height()/2.0 + oldRect.height()/2.0;
setPos(QPointF(x, y));
}
}
我有一些 类 继承自 QGraphicsItem
,它们可以按特定方式排列。为了简化计算,我制作了场景和项目,以 (0, 0) 为中心(boundingRect()
具有 +/- 坐标)。
QGraphicsTextItem
子类违背我的意思,它的 pos()
是相对于左上角的点。
我尝试了很多方法来移动它,使其位于文本中心(例如,建议的解决方案 here - 引用的代码实际上剪切了我的文本,只显示了左下角) .
我想解决方案应该很简单,比如
void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
painter->translate( -boundingRect().width()/2.0, -boundingRect().height()/2.0 );
QGraphicsTextItem::paint(painter, option, widget );
}
以上 "sort of" 有效 - 但是当我增加项目比例 -> 增加字体时,显示的项目被截断...
我尝试设置 pos()
- 但问题是,我仍然需要跟踪场景中的实际位置,所以我不能直接替换它。
一个稍微令人不快的副作用 - 使 QGraphicsView
在元素上居中也不起作用。
如何让我的 QGraphicsTextItem
显示其相对于文本中心的位置?
编辑: 改变boundingRect()
的实验之一:
QRectF TextItem::boundingRect() const
{
QRectF rect = QGraphicsTextItem::boundingRect();
rect.translate(QPointF(-rect.width()/2.0, -rect.height()/2.0));
return rect;
}
我不得不改变初始位置以及调整大小以触发新位置 - 我无法在 paint() 中执行此操作,因为正如我从一开始就认为的那样,任何重绘都会不断地重新计算位置。
只需要调整初始位置-但是随着字体大小(或样式...)的变化,其边界矩形也会发生变化,因此必须重新计算位置-基于之前的位置。
在构造函数中,
setPos(- boundingRect().width()/2, - boundingRect().height()/2);
在修改项目(字体)大小的函数中,
void TextItem::setSize(int s)
{
QRectF oldRect = boundingRect();
QFont f;
f.setPointSize(s);
setFont(f);
if(m_scale != s)
{
m_scale = s;
qreal x = pos().x() - boundingRect().width()/2.0 + oldRect.width()/2.0;
qreal y = pos().y() - boundingRect().height()/2.0 + oldRect.height()/2.0;
setPos(QPointF(x, y));
}
}