Qt:用于旋转和调整qgraphicsscene上存在的qgraphicslineitem的算法

时间:2014-03-09 17:47:57

标签: qt rotation resize qgraphicsitem

有人可以分享算法来旋转和调整QGraphicsScene上的QGraphicsLineItem的大小吗?我希望能够点击该行的任一端并旋转它,而另一端自动成为旋转的锚点。

2 个答案:

答案 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。当然,rotateisClose方法是你自己编写的 - 甚至可以存在于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);
}