我有QGraphicsTextItem
对象QGraphicsScene
。用户可以通过拖动角来缩放QGraphicsTextItem
对象。 (我正在使用自定义“转换编辑器”来执行此操作。)用户还可以通过从属性面板更改字体大小来更改QGraphicsTextItem
的大小。我想要做的就是将这些统一起来,这样当用户通过用鼠标拖动角来缩放对象时,它实际上是在计算“计算出什么尺寸的字体才能使得到的对象符合目标尺寸并保持比例因子为1.0?“根据比例尺计算QGraphicsTextItem字体大小
我现在在做的是让对象按比例缩放,使用QGraphicsItem::mouseMoveEvent
,然后在QGraphicsItem::mouseReleaseEvent
中触发FinalizeMapScale
方法,一旦鼠标缩放完成。然后,此方法应将字体更改为适当的大小,并将缩放比例设置回1.0。
我有一个似乎正在工作的解决方案,但我对此并不满意。我对Qt和C++都比较陌生,因此会对任何评论或更正感到欣慰。
- 有没有更好的方法来构建这件事?
- 是否有Qt方法已经这样做?
- 我的方法是正确的,但有一些Qt或C++错误?
请随时评论我的回答,提交您自己的首选解决方案。谢谢!
[编辑]根据评论请求,这里是缩放代码的基础知识。实际上,我们对此采取了不同的方向,因此此代码(以及下面的代码)不再使用。该代码位于mouseMoveEvent
方法中,如果在右下角的“热点”中单击鼠标,则会在mousePressEvent
之前将“scaling_”标志设置为true。请注意,此代码位于装饰器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);
}
}
我认为用平分算法可能会更好一些,其中一个作为当前字体大小的下限和一个上限是合理的。然后,对于某些N,您应该有一个O(log N)解决方案,依赖于您的数据。 – 2010-07-21 18:07:49
s /'while(true)'/'forever' / – leemes 2012-05-25 16:27:33