2014-07-18 5 views
12

직사각형이 아닌 좌표로 한 점을 사용하여 텍스트 그리기 정렬을 설정하려고합니다.QPainter drawText를 사각형이 아닌 점 둘레로 정렬하는 방법은 무엇입니까?

내가 이해하는 한, QPainter::drawText은 좌표를 직사각형으로 전달할 때만 텍스트 정렬을 설정할 수 있습니다.

사각형이 아닌 점을 기준으로 텍스트를 정렬하려면 어떻게 텍스트 정렬을 설정할 수 있습니까?

답변

23

그리기 텍스트의 시작점을 전달하면 효과적으로 주어진 지점의 왼쪽 하단 모서리에있는 큰 사각형에 텍스트가 그려집니다. 그래서 당신이 필요로하는 모든 당신의 시작점과 선택 정렬에 따라 적절한 "무한"사각형을 제공하는 것입니다 :

screenshot

// https://github.com/KubaO/stackoverflown/tree/master/questions/alignments-24831484 
#include <QtGui> 
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) 
#include <QtWidgets> 
#endif 

void drawText(QPainter & painter, qreal x, qreal y, Qt::Alignment flags, 
       const QString & text, QRectF * boundingRect = 0) 
{ 
    const qreal size = 32767.0; 
    QPointF corner(x, y - size); 
    if (flags & Qt::AlignHCenter) corner.rx() -= size/2.0; 
    else if (flags & Qt::AlignRight) corner.rx() -= size; 
    if (flags & Qt::AlignVCenter) corner.ry() += size/2.0; 
    else if (flags & Qt::AlignTop) corner.ry() += size; 
    else flags |= Qt::AlignBottom; 
    QRectF rect{corner.x(), corner.y(), size, size}; 
    painter.drawText(rect, flags, text, boundingRect); 
} 

void drawText(QPainter & painter, const QPointF & point, Qt::Alignment flags, 
       const QString & text, QRectF * boundingRect = {}) 
{ 
    drawText(painter, point.x(), point.y(), flags, text, boundingRect); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication a{argc, argv}; 
    QLabel label; 
    QPicture pic; 
    pic.setBoundingRect({-100, -100, 200, 200}); 
    QPainter p(&pic); 
    const QPointF pt; 

    p.drawEllipse(pt, 3, 3); 
    p.setFont({"Helvetica", 40}); 
    p.setPen({128, 0, 0, 128}); 
    drawText(p, pt, Qt::AlignBottom, "_LB"); 
    drawText(p, pt, Qt::AlignVCenter, "_LC"); 
    drawText(p, pt, Qt::AlignTop, "_LT"); 
    p.setPen({0, 128, 0, 128}); 
    drawText(p, pt, Qt::AlignBottom | Qt::AlignHCenter, "MB"); 
    drawText(p, pt, Qt::AlignVCenter | Qt::AlignHCenter, "MC"); 
    drawText(p, pt, Qt::AlignTop | Qt::AlignHCenter, "MT"); 
    p.setPen({0, 0, 128, 128}); 
    drawText(p, pt, Qt::AlignBottom | Qt::AlignRight, "RB_"); 
    drawText(p, pt, Qt::AlignVCenter | Qt::AlignRight, "RC_"); 
    drawText(p, pt, Qt::AlignTop | Qt::AlignRight, "RT_"); 
    p.end(); 

    label.setPicture(pic); 
    label.show(); 
    return a.exec(); 
} 
+0

고마워요! 이제 작동합니다. – Ufx

+0

대단한 예! – lucab0ni

+1

drawText (x, y, text)와 동일한 기본 위치 지정을 얻으려면 글꼴 ascent * 0.25 또는 font descent * 1로 오프셋합니다. – Eejin