有人可以分享算法来旋转和调整QGraphicsScene上的QGraphicsLineItem的大小吗?我希望能够点击该行的任一端并旋转它,而另一端自动成为旋转的锚点。
答案 0 :(得分:0)
1-超载场景的mouseMoveEvent
。确保您处于初始状态,没有点击,没有。如果位置足够接近结束,请设置您的标志。
// scene.cpp
void mouseMoveEvent(QMouseEvent *e){
if(moveToRotate){
lineItem->rotate(flag, e->pos());
...
return;
}
if(isClose(e->pos(), lineItem->firstEnd)
flag = 1;
else if(isClose(e->pos(), lineItem->secondEnd)
flag = 2;
else
flag = 0;
return;
}
2-重载场景的mouseClickEvent。如果设置了标志(1或2),请获取锚点。您可以重载lineItem的paint方法以突出显示终点。还设置firstClick标志。
void mouseClickEvent(QMouseEvent *e){ // firstClick happened
if(flag !=0){ //process click
firstClick = true;
paintAnchor = true;
moveToRotate = true;
}
else // neglect click
return;
return;
}
// myCustomLineItemclassThatInheritsQGraphicsLineItem.cpp
void paint(... ){
if(paintAnchor){
...
}
}
有明显的错误,但一般的流程应该是这样的。您可能需要一个信号将布尔值连接到另一个类的paint事件。您可能需要重载mouseReleaseEvent以正确设置moveToRotate。当然,rotate
和isClose
方法是你自己编写的 - 甚至可以存在于API中。
只需构建主流程图,它将对您有所帮助。
答案 1 :(得分:0)
我已经尝试了下面给出的解决方案,它的工作非常出色!!解决方案仅适用于线路旋转。当我在其他Qt平台上发布问题时,我会提供此解决方案。所有的功劳归功于为我提供解决方案的原创作者。
void Line::mousePressEvent( QGraphicsSceneMouseEvent * event ){
const QPointF pos = event->pos();
const qreal l1 = QLineF( pos, this->line().p1() ).length();
const qreal l2 = QLineF( pos, this->line().p2() ).length();
const qreal threshold = 3.5;
if( l1 < l2 and l1 < threshold ){
_dragIndex = 1;
} else if ( l2 < l1 and l2 < threshold ){
_dragIndex = 0;
} else{
_dragIndex = -1;
}
event->setAccepted( _dragIndex != -1 );
}
void Line::mouseMoveEvent( QGraphicsSceneMouseEvent * event ){
if( _dragIndex != -1 ){
const QPointF anchor = _dragIndex == 0 ? this->line().p1() : this->line().p2();
QLineF ma = QLineF(anchor,event->pos());
ma.setLength( line().length() );
const QPointF rotated = anchor + QPointF( ma.dx(), ma.dy() );
this->setLine( _dragIndex == 0 ? QLineF(anchor,rotated) : QLineF(rotated,anchor) );
}
}
void Line::mouseReleaseEvent( QGraphicsSceneMouseEvent * event ){
_dragIndex = -1;
QGraphicsLineItem::mouseReleaseEvent(event);
}