2014-07-18 8 views
12

Desidero impostare l'allineamento del disegno del testo utilizzando un punto come coordinata, non un rettangolo.Come allineare QPassare drawText attorno a un punto, non un rettangolo?

Per quanto ne so, QPainter::drawText consente di impostare l'allineamento del testo solo quando passo le coordinate come rettangolo.

Come si può impostare l'allineamento del testo se si desidera allineare il testo rispetto a un punto, non in un rettangolo?

risposta

23

Quando si passa un punto di partenza per disegnare il testo, si sta effettivamente disegnando il testo su un rettangolo grande che ha l'angolo in basso a sinistra nel punto specificato. Quindi tutto quello che serve è quello di offrire un adeguato rettangolo di "infinito", sulla base di punto di partenza e l'allineamento scelto:

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

Grazie mille! Ora funziona. – Ufx

+0

Fantastico esempio! – lucab0ni

+1

Offset con la salita del font * 0,25 o con la discesa del font * 1 per ottenere lo stesso posizionamento di base di DrawText (x, y, text); – Eejin

Problemi correlati