我QGraphicsTextItem
在QGraphicsScene
. 用户可以QGraphicsTextItem
通过拖动角来缩放对象。(我正在使用自定义“转换编辑器”来执行此操作。)用户还可以QGraphicsTextItem
通过从属性面板更改字体大小来更改大小。我想做的是统一这些,这样当用户通过用鼠标拖动角来缩放对象时,它实际上是在计算“需要什么大小的字体才能使生成的对象适合目标大小并保持比例因子为 1.0?”
我现在正在做的是让对象正常使用缩放QGraphicsItem::mouseMoveEvent
,然后在鼠标缩放完成后触发一个FinalizeMapScale
方法。QGraphicsItem::mouseReleaseEvent
然后,此方法应将字体更改为适当的大小并将比例设置回 1.0。
我有一个似乎有效的解决方案,但我对此并不着迷。我对 Qt 和 C++ 都比较陌生,所以如果有任何意见或更正,我将不胜感激。
- 有没有更好的方法来构建整个事情?
- 是否有已经这样做的 Qt 方法?
- 我的方法是否在正确的轨道上,但有一些 Qt 或 C++ 错误?
在提交您自己的首选解决方案时,请随时评论我的回答。谢谢!
[编辑]根据评论的要求,这里是缩放代码的基础知识。实际上,我们对此采取了不同的方向,因此不再使用此代码(以及下面的代码)。此代码在方法中,如果在右下角的“热点”中单击鼠标,则mouseMoveEvent
先前已将“scaling_”标志设置为true 。mousePressEvent
请注意,此代码位于装饰器 QGraphicsItem 中,该装饰器包含指向它正在缩放的目标的指针。这种抽象对于我们的项目是必要的,但对于大多数用途来说可能是多余的。
void TransformDecorator::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
...
if (scaling_) {
QGraphicsItem *target_item = target_->AsQGraphicsItem();
target_item->setTransformOriginPoint(0.0, 0.0);
QPointF origin_scene = mapToScene(target_item->transformOriginPoint());
QPointF scale_position_scene = mapToScene(event->pos());
qreal unscaled_width = target_item->boundingRect().width();
qreal scale_x = (scale_position_scene.x() - origin_scene.x()) / unscaled_width;
if (scale_x * unscaled_width < kMinimumSize) {
scale_x = kMinimumSize / unscaled_width;
}
target_item->setScale(scale_x);
} else {
QGraphicsObject::mouseMoveEvent(event);
}
}