2017-12-28 23 views
1

LineStringを表示するために自分自身のQGraphicsItemを再定義しました。自分自身でboundingboxを作成し、ペインタが抽象メソッドを再定義する必要があるため、これを再定義しました。Qtの傾きのある直線からの境界値

今、私はこのコードを持っている:

QRectF myQGraphicsLine::boundingRect() const 
{ 
    double lx = qMin(myLine->getX(0), myLine->getX(1)); 
    double rx = qMax(myLine->getX(0), myLine->getX(1)); 
    double ty = qMin(-myLine->getY(0), -myLine->getY(1)); 
    double by = qMax(-myLine->getY(0), -myLine->getY(1)); 
    return QRectF(lx-size/2,ty, rx -lx + size, by-ty).; 
} 

void myQGraphicsLine::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) 
{ 
    pen.setColor(Qt::red); 

    QLine line(myLine->getX(0), -myLine->getY(0), myLine->getX(1), -myLine->getY(1)); 
    pen.setWidth(size); 

    painter->setPen(pen); 

    painter->setBrush(brush); 
    painter->drawLine(line); 
} 

これは、すべてはうまく動作しますが、私はboundingRecと少し問題を抱えています。 ラインは、私はこの結果を得るx軸またはy軸を以下の場合:
BoundingRec is black line

そして、他の位置に私はこれを取得:

​​

を、私はこの必要があります。

enter image description here

誰もがboundinRecを回転させる方法を知っていますか?どうもありがとう!

+2

http://doc.qt.io/qt-5/qgraphicsitem.html#boundingRegion – hyde

+0

に感謝します。@hyde、私はそれをチェックします – Zharios

答えて

1

I再定義された問題を修正しますQGraphicsItem::shape()メソッド。使用このため

、私は私の場合、私はこの機能を使用し、私のライン形状でQPoligonFを作成しました:

void myQGraphicsLine::createSelectionPolygon() 
{ 
    QPolygonF nPolygon; 
    QLineF line(myLine->getX(0), -myLine->getY(0), myLine->getX(1), -myLine->getY(1)); 
    qreal radAngle = line.angle()* M_PI/180; //This the angle of my line vs X axe 
    qreal dx = size/2 * sin(radAngle); 
    qreal dy = size/2 * cos(radAngle); 
    QPointF offset1 = QPointF(dx, dy); 
    QPointF offset2 = QPointF(-dx, -dy); 
    nPolygon << line.p1() + offset1 
     << line.p1() + offset2 
     << line.p2() + offset2 
     << line.p2() + offset1; 
    selectionPolygon = nPolygon; 
    update(); 
} 

彼らは(ペイント)、boundingRect()と形状()メソッドは次のように滞在:

QRectF myQGraphicsLine::boundingRect() const 
{ 
    return selectionPolygon.boundingRect(); 
} 

void myQGraphicsLine::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) 
{ 
    pen.setColor(Qt::red); 

    QLineF line(myLine->getX(0), -myLine->getY(0), myLine->getX(1), -myLine->getY(1)); 
    pen.setWidth(size); 
    painter->setPen(pen); 
    painter->setBrush(brush); 
    painter->drawLine(line); 
} 

QPainterPath myQGraphicsLine::shape() const 
{ 
    QPainterPath path; 
    path.addPolygon(selectionPolygon); 
    return path; 
} 

ありがとうございました!

0

QRectまたはQRectfはローテーションできません。その辺は常に垂直軸と水平軸に平行です。それを矩形の左上隅に 'width'と 'height'メンバを加えた点(x、y)と考えてください。 QRectでどのような変換を行っても、常に「幅」を水平距離、「高さ」を垂直距離と解釈します。

QRectの四隅をポイントとして抽出してから回転させることはできますが、回転したポイントをQRectに変換する方法はありません。ただし、ビューポート/窓。

関連する問題