У меня 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);
}
}