Ich bin erforderlich, um Textelemente mit exakte Breite und Höhe der Textinhalte zu erstellen.
Die Höhe des Textes ist die wichtigste Voraussetzung.
Die Position des Textes sollte relativ zum Text selbst sein.Set QGraphicsTextItem Textinhalt der genauen Höhe und Breite
Ich muss auch in der Lage sein, es auf der Leinwand an einer genauen Stelle zu platzieren.
Angenommen, ein (druckbarer) Canvas (auf einem größeren QGraphicsScene
), sagen 5 Zoll Breite und 1 Zoll Höhe, sollte mein Text in der Lage sein, oben-unten-links-rechts zu strecken - und auf Leinwand, nicht Teil in austeilen.
Ich bin Unterklasse QGraphicsTextItem
für meine Elementart. Ich ändere die Größe, indem ich QTransform()
verwende, auf die erforderliche Größe - in Zoll oder mm oder Pixel (72 * in).
Einstellung auch die document()
Ränder auf 0, und etwas nach innen (wie QTextBlockFormat
Rand) auch auf 0
Ich habe ein setItemSize(QSizeF sz)
umgesetzt (mit sz in Pixeln), dass die QGraphicsTextItem
nach Bedarf skaliert.
Die sz ist initialisiert mit dem Artikel Grenze rect.
Unter der Annahme, keine Umbruch, einzelne Zeile Text (Multi-Zeile könnte separat gelöst werden, sobald dieses Problem gelöst ist).
Beim Hinzufügen des Elements zum Canvas wird immer noch ein oberer und unterer Rand angezeigt - dies hängt von der Schriftart ab.
Ich zeichnete ein Rechteck um das Objekt, um es zu sehen.
Die Abstände zwischen oben und unten hängen von der Schriftauswahl ab.
Ich habe versucht, Font-Metriken zu verwenden, um diese Abstände zu ermitteln (in paint()
Ich habe Linien auf sich gezogen, um zu versuchen, die Position und Rechteck der Text passt, in dem bestimmen).
Ich wäre glücklich, zumindest in der Lage zu sein, korrekte Größe für Großbuchstaben, keine Akzente oder Sonderzeichen Fonts zu bestimmen (es wäre ein Anfang, obwohl natürlich ich in der Lage sein, alle Zeichen zu verwenden).
Aber zumindest eine Möglichkeit, die Größe und die Position (bezogen auf die (0,0) von Artikel) des Textinhalts selbst im einfachsten Fall zu bestimmen .....
Die Fontmetriken tightBoundingRect()
scheint die genaueste für die Größe, aber es scheint unmöglich zu sein, seine Position zu bestimmen, so dass ich meine Artikel irgendwie richtig erstellen kann und sie vielleicht auf die Leinwand anpassen kann.
Hier sind einige Beispiele für meinen Kampf zumindest genaue Größe und Position des Textes, bezogen auf das (0,0) des Artikels zu bestimmen (unter der Annahme, dass, wenn ich das tue, ich bin in der Lage zu belichten, dass Info nach außen oder die Verschiebung in den Artikel bei der Größenänderung umwandeln).
Beachten Sie, dass die Größe des Textes, der von den Schriftmetriken beworben wird, nicht immer den Text abdeckt, und für verschiedene Schriftarten bin ich nicht in der Lage, das enge umgebende Rechteck (Magenta) um den Text selbst zu positionieren. (Ich habe mehrere Vermutungen gemacht, der folgende Code ist nur einer - die Zeilen versuchen, unterschiedliche Schriftgrößen anzuzeigen).
die oben waren Experimente in Farbe Funktion des Textelementes vererben QGraphicsTextItem
:
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
// draw text
QGraphicsTextItem::paint(painter, option, widget);
QPen p;
p.setWidthF(0);
QFontMetricsF fm(this->font());
qreal ascent = fm.ascent(),
descent = fm.descent(),
hheight = fm.height();
QRectF r = QGraphicsTextItem::boundingRect();
QRectF rFont= fm.tightBoundingRect(toPlainText());
qreal xmax = r.right();
painter->save();
painter->setBrush(Qt::NoBrush);
// where is "ascent + descent"
p.setColor(Qt::green);
painter->setPen(p);
painter->drawLine(QPointF(2, ascent), QPointF(2, ascent + descent));
painter->drawLine(QPointF(2, ascent + descent), QPointF(xmax/2, ascent + descent));
// where is "height"
p.setColor(Qt::red);
painter->setPen(p);
painter->drawLine(QPointF(xmax/2, 0), QPointF(xmax/2, hheight));
painter->drawLine(QPointF(xmax/2, ascent + descent), QPointF(xmax, ascent + descent));
// where is "ascent"
p.setColor(Qt::yellow);
painter->setPen(p);
painter->drawLine(QPointF(6, 0), QPointF(6, ascent));
painter->drawLine(QPointF(6, ascent), QPointF(xmax, ascent));
// something that may look like top of the text
p.setColor(Qt::blue);
painter->setPen(p);
qreal yyy = ascent + rFont.y() + 1;
painter->drawLine(QPointF(5, yyy), QPointF(xmax, yyy));
// this should be useful... should be the natural offset
qreal yoffset = (r.height() - rFont.height())/2;
// qDebug() << yoffset << r << rFont;
//qreal y0 = (r.height() - fm.height())/2;
p.setColor(Qt::darkGreen);
painter->drawEllipse(10, yoffset, 1, 1);
// where is the font rect
p.setColor(Qt::magenta);
painter->setPen(p);
yoffset = (r.height() + rFont.height())/2;
painter->translate(0, yoffset);
painter->drawRect(rFont);
painter->restore();
}
Ich habe versucht, auch nicht QGraphicsTextItem
verwenden, aber Farbe Text in einem Rechteck. Das Gleiche passiert.
(Qt 4.7 - 5.x)
Bitte geben Sie einen Screenshot, was Sie sehen und was Sie erwarten. Ich habe das Gefühl, dass du mit Aufstieg oder etwas ähnlichem kämpfst. –
@MarekR - Ich habe meine Funktion zur Berechnung der Position und Screenshots in meiner Antwort unten hinzugefügt. – Thalia