问题
如何计算和设置QGraphicsItem相对于新父母来源的新位置?
背景资料
我正在开发一个调整大小的功能,在双击给定对象(矩形,椭圆等)时会弹出一个带有一个锚点的边界框。用户可以通过调整锚点的位置来调整对象的大小。
什么是工作
用户可以在首次调整大小时双击对象并调整大小。
有问题的观察
在连续调整大小(通过)时,用户在双击对象并稍微移动锚点后立即看到对象“跳跃”(即突然调整大小)。 对象不会突然调整到任何位置,而是完全调整到前一个父级的位置。
找到根本原因
我已将问题缩小到以下语句(来自我们重载的mousemoveevent()函数的片段):
dynamic_cast<RIShape*>(_item)->scaleBy(myp, xscale, yscale);
参考描述类似问题的在线发布
在我看了一下之前,在发布此消息之前,我遇到了以下参考: http://www.qtcentre.org/threads/22775-Qgraphicsitem-parent-child-paint-problem
根据这条消息判断,我需要计算并设置QGraphicsItem(_item)相对于新父母来源的新位置。因此,上面的问题。
P.S。如果您有兴趣,可以使用以下附加代码片段:
创建大小调整器(带有锚点的边界框)并绑定到要调整大小的对象的方法
QGraphicsItem* item = itemAt( event->pos() );
RIShape* shape= dynamic_cast<RIShape*>(item);
if( item && shape )
{
if( !_selector )
{
_selector = new RISelector(item);
...
初始化Resizer的构造函数的方法(RISelector)
RISelector(QGraphicsItem* item)
: QGraphicsRectItem(item->sceneBoundingRect()), _W(10.0),
_rect(item->sceneBoundingRect()), _pivot(0,0), _pressed(false), _isResizing(false),
_bndBoxPen(Qt::black, 2, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin),
_anchorPen(Qt::black, 2, Qt::SolidLine), _item(item), _isLef(false)