我有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