static QTextLine setupLayout(QTextLayout* layout, const TextRun& style) { int flags = style.rtl() ? Qt::TextForceRightToLeft : Qt::TextForceLeftToRight; if (style.padding()) flags |= Qt::TextJustificationForced; layout->setFlags(flags); layout->beginLayout(); QTextLine line = layout->createLine(); line.setLineWidth(INT_MAX/256); if (style.padding()) line.setLineWidth(line.naturalTextWidth() + style.padding()); layout->endLayout(); return line; }
int JobItem::descriptionHeight(const QStyleOptionViewItem & option) { int textTotalWidth = 0; int lineWidth = option.rect.width() - 2 * m_itemPadding; QString description = m_job->description().simplified(); QTextLayout descriptionLayout(description, m_descriptionFont, m_paintDevice); descriptionLayout.beginLayout(); for (int i = 0; i < m_descriptionLineCount - 1; ++i) { QTextLine line = descriptionLayout.createLine(); if (!line.isValid()) { // There is no text left to be inserted into the layout. break; } line.setLineWidth(lineWidth); textTotalWidth += line.naturalTextWidth(); } descriptionLayout.endLayout(); // Add space for last visible line. textTotalWidth += lineWidth; m_descriptionText = m_descriptionFontMetrics.elidedText(description, Qt::ElideRight, textTotalWidth); m_descriptionRect = m_descriptionFontMetrics.boundingRect(0, 0, option.rect.width() - 2 * m_itemPadding, 0, descriptionFlags(), m_descriptionText); return m_descriptionRect.height(); }
void paint_QTextLayout(QPainter &p, bool useCache) { static bool first = true; static QTextLayout *textLayout[lines]; if (first) { for (int i = 0; i < lines; ++i) { textLayout[i] = new QTextLayout(strings[i]); int leading = p.fontMetrics().leading(); qreal height = 0; qreal widthUsed = 0; textLayout[i]->setCacheEnabled(useCache); textLayout[i]->beginLayout(); while (1) { QTextLine line = textLayout[i]->createLine(); if (!line.isValid()) break; line.setLineWidth(lineWidth); height += leading; line.setPosition(QPointF(0, height)); height += line.height(); widthUsed = qMax(widthUsed, line.naturalTextWidth()); } textLayout[i]->endLayout(); } first = false; } for (int i = 0; i < count; ++i) { for (int j = 0; j < lines; ++j) { textLayout[j]->draw(&p, QPoint(0, j*spacing)); } } }
void RowHeader::drawText(QPainter* painter, const QFont& font, qreal ypos, qreal width, const QString& text) const { register Sheet * const sheet = m_pCanvas->activeSheet(); if (!sheet) return; const double scaleX = POINT_TO_INCH(double(KoDpi::dpiX())); const double scaleY = POINT_TO_INCH(double(KoDpi::dpiY())); // Qt scales the font already with the logical resolution. Do not do it twice! painter->save(); painter->scale(1.0 / scaleX, 1.0 / scaleY); QTextLayout textLayout(text, font); textLayout.beginLayout(); textLayout.setTextOption(QTextOption(Qt::AlignHCenter)); forever { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(width * scaleX); } textLayout.endLayout(); QPointF loc(0, ypos * scaleY); textLayout.draw(painter, loc); painter->restore(); }
void YTDelegate::layoutText(QTextLayout& textLayout, QString text, QSize constraint) const { QTextOption textOption(Qt::AlignJustify); textLayout.setTextOption(textOption); textLayout.setText(text); textLayout.beginLayout(); int lHeight = 0; while(true){ QTextLine line = textLayout.createLine(); if(!line.isValid()) break; line.setLineWidth(constraint.width()); line.setPosition(QPointF(0, lHeight)); if(lHeight + line.height() > constraint.height()) { QTextLine lastLine = textLayout.lineAt(textLayout.lineCount() - 2); QString lastString = text.mid(lastLine.textStart()); QFontMetrics fm(textLayout.font()); text.chop(lastString.length()); text += fm.elidedText(lastString, Qt::ElideRight, constraint.width()-1); textLayout.endLayout(); layoutText(textLayout, text, constraint); return; } lHeight += line.height(); lHeight += line.leading(); } textLayout.endLayout(); }
void setUnicodeText(const QString &text, const QFont &font, const QColor &color) { deleteContent(); QRawFont raw_font = QRawFont::fromFont(font, QFontDatabase::Latin); qreal line_width = raw_font.averageCharWidth() * text.size(); QSGRenderContext *sgr = QQuickItemPrivate::get(m_owner)->sceneGraphRenderContext(); QTextLayout layout(text,font); layout.beginLayout(); QTextLine line = layout.createLine(); line.setLineWidth(line_width); //Q_ASSERT(!layout.createLine().isValid()); layout.endLayout(); QList<QGlyphRun> glyphRuns = line.glyphRuns(); qreal xpos = 0; for (int i = 0; i < glyphRuns.size(); i++) { QSGGlyphNode *node = sgr->sceneGraphContext()->createGlyphNode(sgr, false); node->setOwnerElement(m_owner); node->geometry()->setIndexDataPattern(QSGGeometry::StaticPattern); node->geometry()->setVertexDataPattern(QSGGeometry::StaticPattern); node->setGlyphs(QPointF(xpos, raw_font.ascent()), glyphRuns.at(i)); node->setStyle(QQuickText::Normal); node->setColor(color); xpos += raw_font.averageCharWidth() * glyphRuns.at(i).positions().size(); node->update(); appendChildNode(node); } }
void FileMetaDataToolTip::setName(const QString& name) { QTextOption textOption; textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); const QString processedName = Qt::mightBeRichText(name) ? name : KStringHandler::preProcessWrap(name); QTextLayout textLayout(processedName); textLayout.setFont(m_name->font()); textLayout.setTextOption(textOption); QString wrappedText; wrappedText.reserve(processedName.length()); // wrap the text to fit into the maximum width of m_name textLayout.beginLayout(); QTextLine line = textLayout.createLine(); while (line.isValid()) { line.setLineWidth(m_name->maximumWidth()); wrappedText += processedName.midRef(line.textStart(), line.textLength()); line = textLayout.createLine(); if (line.isValid()) { wrappedText += QChar::LineSeparator; } } textLayout.endLayout(); m_name->setText(wrappedText); }
void TextLabel::layoutText(QTextLayout &layout, const QString &text, const QSize &constraints) { QFontMetrics metrics(layout.font()); int leading = metrics.leading(); int height = 0; int maxWidth = constraints.width(); int widthUsed = 0; int lineSpacing = metrics.lineSpacing(); QTextLine line; layout.setText(text); layout.beginLayout(); while ((line = layout.createLine()).isValid()) { height += leading; // Make the last line that will fit infinitely long. // drawTextLayout() will handle this by fading the line out // if it won't fit in the constraints. if (height + 2 * lineSpacing > constraints.height()) { line.setPosition(QPoint(0, height)); break; } line.setLineWidth(maxWidth); line.setPosition(QPoint(0, height)); height += int(line.height()); widthUsed = int(qMax(qreal(widthUsed), line.naturalTextWidth())); } layout.endLayout(); }
//virtual void PixButton::redoLabelTextLayout() { //TODO: somewhat wasteful. If there is no label, should just exit early and leave a layout that will be left unrendered by paint() m_textLayoutObject.clearLayout(); m_textLayoutObject.setText(m_label); m_textLayoutObject.setFont(m_textFont); QTextOption textOpts; textOpts.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); textOpts.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); m_textLayoutObject.setTextOption(textOpts); QFontMetrics textFontMetrics(m_textFont); int leading = textFontMetrics.leading(); int rise = textFontMetrics.ascent(); qreal height = 0; m_textLayoutObject.beginLayout(); while (height < m_labelMaxGeom.height()) { QTextLine line = m_textLayoutObject.createLine(); if (!line.isValid()) break; line.setLineWidth(m_labelMaxGeom.width()); if (m_textLayoutObject.lineCount() > 1) { height += leading; } line.setPosition(QPointF(0, height)); height += line.height(); } height = qMin((quint32)DimensionsGlobal::roundUp(height),(quint32)m_labelMaxGeom.height()); height = DimensionsGlobal::roundDown(height) - (DimensionsGlobal::roundDown(height) % 2); //force to an even # m_textLayoutObject.endLayout(); //TODO: PIXEL-ALIGN m_labelGeom = DimensionsGlobal::realRectAroundRealPoint(QSizeF(m_textLayoutObject.boundingRect().width(),height)).toAlignedRect(); }
void TestResultDelegate::recalculateTextLayout(const QModelIndex &index, const QString &output, const QFont &font, int width) const { if (m_lastProcessedIndex == index && m_lastProcessedFont == font) return; const QFontMetrics fm(font); const int leading = fm.leading(); const int fontHeight = fm.height(); m_lastProcessedIndex = index; m_lastProcessedFont = font; m_lastCalculatedHeight = 0; m_lastCalculatedLayout.clearLayout(); m_lastCalculatedLayout.setText(output); m_lastCalculatedLayout.setFont(font); QTextOption txtOption; txtOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); m_lastCalculatedLayout.setTextOption(txtOption); m_lastCalculatedLayout.beginLayout(); while (true) { QTextLine line = m_lastCalculatedLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(width); m_lastCalculatedHeight += leading; line.setPosition(QPoint(0, m_lastCalculatedHeight)); m_lastCalculatedHeight += fontHeight; } m_lastCalculatedLayout.endLayout(); }
void PluginListDelegate::drawDisplay(QPainter* painter, const QStyleOptionViewItem &option, const QRect &rect, const QString &text) const { QTextDocument textDocument; textDocument.setHtml(text); QTextLayout textLayout(textDocument.begin()); textLayout.setFont(option.font); const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin, 0) + 1; QRect textRect = rect.adjusted(textMargin, 0, -textMargin, 0); // remove width padding textLayout.beginLayout(); qreal height = 0; while (1) { QTextLine line = textLayout.createLine(); if (!line.isValid()) { break; } line.setLineWidth(textRect.width()); height += 3; line.setPosition(QPoint(0, height)); height += line.height(); } textLayout.endLayout(); textLayout.draw(painter, QPointF(textRect.left(), textRect.top())); }
void KCRowHeader::drawText(QPainter& painter, const QFont& font, const QPointF& location, const QString& text) const { register KCSheet * const sheet = m_pView->activeSheet(); if (!sheet) return; const double scaleX = POINT_TO_INCH(double(KoDpi::dpiX())); const double scaleY = POINT_TO_INCH(double(KoDpi::dpiY())); // Qt scales the font already with the logical resolution. Do not do it twice! painter.save(); painter.scale(1.0 / scaleX, 1.0 / scaleY); QTextLayout textLayout(text, font); textLayout.beginLayout(); forever { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(width() * scaleX); } textLayout.endLayout(); QPointF loc(location.x() * scaleX, location.y() * scaleY); textLayout.draw(&painter, loc); painter.restore(); }
void ChatItem::doLayout(QTextLayout *layout) const { layout->beginLayout(); QTextLine line = layout->createLine(); if(line.isValid()) { line.setLineWidth(width()); line.setPosition(QPointF(0,0)); } layout->endLayout(); }
QStringList StatusEventItemDelegate::layoutText(const QString &text, const QFont &font, int maxLineWidth, int maxLines, int *textHeight) { QTextLayout textLayout(text, font); QFontMetrics fontMetrics(font); QStringList lines; qreal height = 0.0; textLayout.beginLayout(); while (lines.size() < maxLines) { QTextLine line = textLayout.createLine(); if (! line.isValid()) break; if (maxLines <= 0 || lines.size() < maxLines-1) { // Wrap the current line at or below the maximum line width line.setLineWidth(maxLineWidth); lines.append(text.mid(line.textStart(), line.textLength())); } else { // Set the line width beyond the max line width, and then elide it // so the user has a visible indication that the full message is // longer than what is visible. line.setLineWidth(2 * maxLineWidth); lines.append(fontMetrics.elidedText(text.mid(line.textStart()), Qt::ElideRight, maxLineWidth)); } height += fontMetrics.leading() + line.height(); } textLayout.endLayout(); if (textHeight) *textHeight = qRound(height); return lines; }
// Origin: Qt static void viewItemTextLayout ( QTextLayout &textLayout, int lineWidth, qreal &height, qreal &widthUsed ) { height = 0; widthUsed = 0; textLayout.beginLayout(); while ( true ) { QTextLine line = textLayout.createLine(); if ( !line.isValid() ) break; line.setLineWidth ( lineWidth ); line.setPosition ( QPointF ( 0, height ) ); height += line.height(); widthUsed = qMax ( widthUsed, line.naturalTextWidth() ); } textLayout.endLayout(); }
static int layoutText(QTextLayout *layout, int maxWidth) { qreal height = 0; int textWidth = 0; layout->beginLayout(); while (true) { QTextLine line = layout->createLine(); if (!line.isValid()) { break; } line.setLineWidth(maxWidth); line.setPosition(QPointF(0, height)); height += line.height(); textWidth = qMax(textWidth, qRound(line.naturalTextWidth() + 0.5)); } layout->endLayout(); return textWidth; }
QSizeF QItemDelegatePrivate::doTextLayout(int lineWidth) const { qreal height = 0; qreal widthUsed = 0; textLayout.beginLayout(); while (true) { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(lineWidth); line.setPosition(QPointF(0, height)); height += line.height(); widthUsed = qMax(widthUsed, line.naturalTextWidth()); } textLayout.endLayout(); return QSizeF(widthUsed, height); }
//This is for one line of html-formatted text qreal pixelOffsetForHtmlChar( QFont font, QString text, int index) { if(index==-1){ index = text.length()-1; } QTextLayout tl(text,font); tl.beginLayout(); QTextLine line = tl.createLine(); Q_ASSERT( line.isValid() ); line.setLineWidth(1000); int pos = line.cursorToX(index); tl.endLayout(); return pos; }
QSize QDeclarativeTextPrivate::setupTextLayout(QTextLayout *layout) { Q_Q(QDeclarativeText); layout->setCacheEnabled(true); int height = 0; qreal widthUsed = 0; qreal lineWidth = 0; //set manual width if ((wrap || elideMode != QDeclarativeText::ElideNone) && q->widthValid()) lineWidth = q->width(); layout->beginLayout(); while (1) { QTextLine line = layout->createLine(); if (!line.isValid()) break; if ((wrap || elideMode != QDeclarativeText::ElideNone) && q->widthValid()) line.setLineWidth(lineWidth); } layout->endLayout(); int x = 0; for (int i = 0; i < layout->lineCount(); ++i) { QTextLine line = layout->lineAt(i); widthUsed = qMax(widthUsed, line.naturalTextWidth()); line.setPosition(QPointF(0, height)); height += int(line.height()); if (!cache) { if (hAlign == QDeclarativeText::AlignLeft) { x = 0; } else if (hAlign == QDeclarativeText::AlignRight) { x = q->width() - (int)line.naturalTextWidth(); } else if (hAlign == QDeclarativeText::AlignHCenter) { x = (q->width() - (int)line.naturalTextWidth()) / 2; } line.setPosition(QPoint(x, (int)line.y())); } } return QSize(qCeil(widthUsed), height); }
// copied from QItemDelegate for drawDisplay QSizeF doTextLayout(QTextLayout *textLayout, int lineWidth) { qreal height = 0; qreal widthUsed = 0; textLayout->beginLayout(); while (true) { QTextLine line = textLayout->createLine(); if (!line.isValid()) break; line.setLineWidth(lineWidth); line.setPosition(QPointF(0, height)); height += line.height(); widthUsed = qMax(widthUsed, line.naturalTextWidth()); } textLayout->endLayout(); return QSizeF(widthUsed, height); }
//! [2] void ElidedLabel::paintEvent(QPaintEvent *event) { QFrame::paintEvent(event); QPainter painter(this); QFontMetrics fontMetrics = painter.fontMetrics(); bool didElide = false; int lineSpacing = fontMetrics.lineSpacing(); int y = 0; QTextLayout textLayout(content, painter.font()); textLayout.beginLayout(); forever { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(width()); int nextLineY = y + lineSpacing; if (height() >= nextLineY + lineSpacing) { line.draw(&painter, QPoint(0, y)); y = nextLineY; //! [2] //! [3] } else { QString lastLine = content.mid(line.textStart()); QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, width()); painter.drawText(QPoint(0, y + fontMetrics.ascent()), elidedLastLine); line = textLayout.createLine(); didElide = line.isValid(); break; } } textLayout.endLayout(); //! [3] //! [4] if (didElide != elided) { elided = didElide; emit elisionChanged(didElide); } }
void Window::paintEvent(QPaintEvent *event) { //! [0] QTextLayout textLayout(text, font); qreal margin = 10; qreal radius = qMin(width()/2.0, height()/2.0) - margin; QFontMetrics fm(font); qreal lineHeight = fm.height(); qreal y = 0; textLayout.beginLayout(); while (1) { // create a new line QTextLine line = textLayout.createLine(); if (!line.isValid()) break; qreal x1 = qMax(0.0, pow(pow(radius,2)-pow(radius-y,2), 0.5)); qreal x2 = qMax(0.0, pow(pow(radius,2)-pow(radius-(y+lineHeight),2), 0.5)); qreal x = qMax(x1, x2) + margin; qreal lineWidth = (width() - margin) - x; line.setLineWidth(lineWidth); line.setPosition(QPointF(x, margin+y)); y += line.height(); } textLayout.endLayout(); QPainter painter; painter.begin(this); painter.setRenderHint(QPainter::Antialiasing); painter.fillRect(rect(), Qt::white); painter.setBrush(QBrush(Qt::black)); painter.setPen(QPen(Qt::black)); textLayout.draw(&painter, QPoint(0,0)); painter.setBrush(QBrush(QColor("#a6ce39"))); painter.setPen(QPen(Qt::black)); painter.drawEllipse(QRectF(-radius, margin, 2*radius, 2*radius)); painter.end(); //! [0] }
void ElidedLabel::paintEvent(QPaintEvent *event) { QLabel::paintEvent(event); QPainter painter(this); QFontMetrics fontMetrics = painter.fontMetrics(); QRect cr = contentsRect(); cr.adjust(margin(), margin(), -margin(), -margin()); bool didElide = false; int lineSpacing = fontMetrics.lineSpacing(); int x, y = x =cr.top()+(cr.height()-lineSpacing)/2; QTextLayout textLayout(mContent, painter.font()); textLayout.beginLayout(); forever { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(cr.width()+2*x); int nextLineY = y + lineSpacing; if (cr.height() >= nextLineY + lineSpacing) { line.draw(&painter, QPoint(x, y)); y = nextLineY; } else { QString lastLine = mContent.mid(line.textStart()); QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, cr.width()); painter.drawText(QPoint(x, y + fontMetrics.ascent()), elidedLastLine); line = textLayout.createLine(); didElide = line.isValid(); break; } } textLayout.endLayout(); if (didElide != mElided) { mElided = didElide; emit elisionChanged(didElide); } }
void StyledLabel::layout() { qreal h = 0; qreal w = contentsRect().width(); _layout.beginLayout(); forever { QTextLine line = _layout.createLine(); if (!line.isValid()) break; line.setLineWidth(w); line.setPosition(QPointF(0, h)); h += line.height(); } _layout.endLayout(); updateSizeHint(); updateToolTip(); update(); }
qreal QmlConsoleItemDelegate::layoutText(QTextLayout &tl, int width, bool *showFileLineInfo) const { qreal height = 0; tl.beginLayout(); while (true) { QTextLine line = tl.createLine(); if (!line.isValid()) break; line.setLeadingIncluded(true); line.setLineWidth(width); if (width < line.naturalTextWidth() && showFileLineInfo) *showFileLineInfo = false; line.setPosition(QPoint(0, height)); height += line.height(); } tl.endLayout(); return height; }
void PluginListDelegate::drawDisplay(QPainter* painter, const QStyleOptionViewItem &option, const QRect &rect, const QString &text) const { QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) { cg = QPalette::Inactive; } if (option.state & QStyle::State_Selected) { painter->fillRect(rect, option.palette.brush(cg, QPalette::Highlight)); painter->setPen(option.palette.color(cg, QPalette::HighlightedText)); } else { painter->setPen(option.palette.color(cg, QPalette::Text)); } QTextDocument textDocument; textDocument.setHtml(text); QTextLayout textLayout(textDocument.begin()); textLayout.setFont(option.font); const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin, 0) + 1; QRect textRect = rect.adjusted(textMargin, 0, -textMargin, 0); // remove width padding textLayout.beginLayout(); qreal height = 0; QTextLine line = textLayout.createLine(); while (line.isValid()) { line.setLineWidth(textRect.width()); height += 3; line.setPosition(QPoint(0, height)); height += line.height(); line = textLayout.createLine(); } textLayout.endLayout(); textLayout.draw(painter, QPointF(textRect.left(), textRect.top())); }
//virtual void PageTab::redoLabelTextLayout() { //TODO: somewhat wasteful. If there is no label, should just exit early and leave a layout that will be left unrendered by paint() m_textLayoutObject.clearLayout();; //TODO: Need a real fix later instead of localizing the labels at runtime QString m_tabLabelLocalized = fromStdUtf8(LOCALIZED(m_tabLabel.toStdString())); m_textLayoutObject.setText(m_tabLabelLocalized); // int fontSize = qBound(4,(int)((qreal)(m_labelMaxGeom.height())*0.5),24) -2; // fontSize = fontSize - (fontSize % 2); // m_textFont.setPixelSize(fontSize); m_textLayoutObject.setFont(m_textFont); QTextOption textOpts; textOpts.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); textOpts.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); m_textLayoutObject.setTextOption(textOpts); QFontMetrics textFontMetrics(m_textFont); int leading = textFontMetrics.leading(); int rise = textFontMetrics.ascent(); qreal height = 0; m_textLayoutObject.beginLayout(); while (height < m_labelMaxGeom.height()) { QTextLine line = m_textLayoutObject.createLine(); if (!line.isValid()) break; line.setLineWidth(m_labelMaxGeom.width()); if (m_textLayoutObject.lineCount() > 1) { height += leading; } line.setPosition(QPointF(0, height)); height += line.height(); } height = qMin((quint32)DimensionsGlobal::roundUp(height),(quint32)m_labelMaxGeom.height()); height = DimensionsGlobal::roundDown(height) - (DimensionsGlobal::roundDown(height) % 2); //force to an even # m_textLayoutObject.endLayout(); //TODO: PIXEL-ALIGN m_labelGeom = DimensionsGlobal::realRectAroundRealPoint(QSizeF(m_textLayoutObject.boundingRect().width(),height)).toAlignedRect(); }
// Calculates the height of the description text based on widget width int QCommandLinkButtonPrivate::descriptionHeight(int widgetWidth) const { // Calc width of actual paragraph int lineWidth = widgetWidth - textOffset() - rightMargin(); qreal descriptionheight = 0; if (!description.isEmpty()) { QTextLayout layout(description); layout.setFont(descriptionFont()); layout.beginLayout(); while (true) { QTextLine line = layout.createLine(); if (!line.isValid()) break; line.setLineWidth(lineWidth); line.setPosition(QPointF(0, descriptionheight)); descriptionheight += line.height(); } layout.endLayout(); } return qRound(descriptionheight); }
void ElidedLabel::paintEvent( QPaintEvent* event ) { QFrame::paintEvent( event ); QPainter p( this ); QRect r = contentsRect(); r.adjust( m_margin, m_margin, -m_margin, -m_margin ); if ( m_multiLine ) { QTextLayout textLayout( m_text ); textLayout.setFont( p.font() ); int widthUsed = 0; int lineCount = 0; int lineLimit = r.height() / fontMetrics().height(); textLayout.beginLayout(); while ( ++lineCount < lineLimit ) { QTextLine line = textLayout.createLine(); if ( !line.isValid() ) break; line.setLineWidth( r.width() ); widthUsed += line.naturalTextWidth(); } textLayout.endLayout(); widthUsed += r.width(); const QString elidedText = fontMetrics().elidedText( m_text, Qt::ElideRight, widthUsed ); p.drawText( r, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, elidedText ); } else { const QString elidedText = fontMetrics().elidedText( m_text, m_mode, r.width() ); p.drawText( r, m_align, elidedText ); } }
void FadingMultilineLabel::positionLayouts() { QFontMetricsF fm = fontMetrics(); qreal lineHeight = fm.height(); delete textLayout_; textLayout_ = 0; textLayout_ = new QTextLayout(text_, font()); textLayout_->setTextOption(textOption_); // textLayout_->setAdditionalFormats(formats[p]); textLayout_->beginLayout(); qreal x = 0.0; qreal y = 0.0; qreal ymax = 0.0; fadeOuts_.clear(); QTextLine line = textLayout_->createLine(); while (line.isValid()) { line.setPosition(QPointF(x, y)); line.setLineWidth(width()); if (line.naturalTextWidth() > width()) { fadeOuts_ << QRect(x, y, width(), lineHeight); } y += line.height(); line = textLayout_->createLine(); } textLayout_->endLayout(); sizeHint_ = QSize(width(), y); updateGeometry(); }