텍스트 내용을 정확하게 작성하려면 폭과 높이가 인 인 텍스트 항목을 만들어야합니다.
텍스트의 높이가 가장 중요한 요구 사항입니다.
텍스트의 위치는 텍스트 자체에 상대적이어야합니다.정확한 높이와 너비의 QGraphicsTextItem 텍스트 내용 설정
정확한 위치에 캔버스에 배치 할 수 있어야합니다.
너비가 5 인치이고 높이가 1 인치 인 (인쇄용) 캔버스를 사용한다고 가정하면 내 텍스트는 왼쪽 아래에서 왼쪽 아래까지 늘릴 수 있어야하고 일부는 아닌 캔버스에 배치해야합니다. 밖으로 나간다.
내 항목 유형에 대해 QGraphicsTextItem
을 하위 분류하고 있습니다. QTransform()
을 사용하여 필요한 크기 (인치 또는 mm 또는 픽셀 (72 * in))로 크기를 조정하고 있습니다.
또한 I는 필요에 따라이 setItemSize(QSizeF sz)
(픽셀 SZ으로), 즉 QGraphicsTextItem
크기를 조절 구현 또한 0
에 내부 document()
0 마진 아무것도 (같은 QTextBlockFormat
마진)를 설정.
sz는 항목 경계 rect를 사용하여 초기화됩니다.
줄 바꿈이없는 것으로 가정하면 한 줄 텍스트 (이 문제가 해결되면 여러 줄을 개별적으로 해결할 수 있음).
항목을 캔버스에 추가 할 때 상단 및 하단 여백이 여전히 표시되며 글꼴 선택에 따라 다릅니다.
항목 주위에 직사각형을 그려 보았습니다.
위쪽/아래쪽 간격은 글꼴 선택에 따라 다릅니다.
나는 (텍스트가 맞는있는 위치와 사각형을 결정하려고 paint()
에 내가 선을 그릴되었다)이 거리를 결정하는 글꼴 메트릭을 사용하려고했다.
적어도 대문자, 악센트 또는 특수 문자 글꼴에 사용할 올바른 크기를 결정할 수있어서 기쁠 것입니다. (자연스럽지 만 어떤 문자도 사용할 수 있어야합니다).
그러나 적어도 몇 가지 방법은 tightBoundingRect()
보인다
글꼴 메트릭 ..... 심지어 간단한 경우에 텍스트 내용의 (항목)를 (0, 0을 기준으로) 크기와 위치를 결정하는 크기에 대해 가장 정확하지만 위치를 결정하는 것이 불가능 해 보이므로 필자는 올바르게 항목을 만들고 어쩌면 캔버스에 맞게 크기를 조정하거나 바꿀 수 있습니다. 여기
적어도 항목의 (0,0)을 기준으로 크기와 텍스트의 위치, 정확한 (나는 그렇게되면 나는 것을 노출 할 수 있어요 가정을 결정하기 위해 내 투쟁의 몇 가지 예입니다 정보를 외부로 가져 오거나 크기 변경시 항목 변형 시프트 포함).
글꼴 메트릭에 의해 보급 된 텍스트의 크기가 텍스트를 항상 포함하는 것은 아니며 글꼴마다 글꼴 주위에 단단한 경계선 (마젠타)을 배치 할 수 없다는 점에 유의하십시오. (나는 여러 가지 추측을했는데, 아래의 코드는 단지 하나의 코드입니다 - 선은 다른 글꼴 메트릭 크기를 표시하려고합니다).나는 또한
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();
}
하지만, 사각형 내부 페인트 텍스트 :
위
는QGraphicsTextItem
을 상속 텍스트 항목의 페인트 기능의 실험이었다. 같은 일이 일어난다. (Qt는 4.7 - 5.x를)
귀하가보고있는 것과 기대하고있는 것을 스크린 샷으로 제공해주십시오. 나는 당신이 등반이나 비슷한 것을 가지고 싸우고 있다고 느끼고 있습니다. –
@MarekR - 위치 및 화면 샷 계산에 대한 내 기능을 아래의 답에서 추가했습니다. – Thalia