Название: Текст не влазит
Отправлено: Igors от Января 23, 2014, 10:01
Добрый день
Есть строка txt но ее вывод ограничен шириной maxWidth. Разумеется задан текущий шрифт. Требуется:
- если строка влазит, просто вывести ее текущим шрифтом (с этим нет проблем). Иначе - попытаться вывести строку тем же, но более сжатым шрифтом. Иначе (все равно не влазит) - отрубать конец строки и добавлять ... (многоточие) до тех пор пока не влезет
Как это сделать избегая утомительной ручной работы?
Спасибо
Название: Re: Текст не влазит
Отправлено: GreatSnake от Января 23, 2014, 10:25
- отрубать конец строки и добавлять ... (многоточие) до тех пор пока не влезет
C++ (Qt) QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 )
И о каком контексте идёт речь?
Название: Re: Текст не влазит
Отправлено: Old от Января 23, 2014, 10:34
- QFontMetrics::width для обычного шртфта если не влазит, то - QFontMetrics::elidedText для сжатого шрифта.
Название: Re: Текст не влазит
Отправлено: Igors от Января 23, 2014, 10:43
И о каком контексте идёт речь?
Произвольном, рисуем через QPainter C++ (Qt) QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 )
Спасибо, какая прелесть! А сжатие (condensed) все-таки самому подбирать? (я конечно руками уже сделал, но хотелось "попастись" :))
Название: Re: Текст не влазит
Отправлено: GreatSnake от Января 23, 2014, 10:51
А сжатие (condensed) все-таки самому подбирать?
Я у себя не подбираю, а сам "сжимаю": C++ (Qt) static void drawText( QPainter& p, const QRectF& r, // bounding rect const QString& str, int flags = Qt::AlignTop | Qt::AlignLeft, int font_weight = QFont::Normal ) { QTransform wm = p.transform(); qreal scale = wm.m11() ? wm.m11() : qAbs( wm.m21() ); if( r.height() * scale < 4 ) return; static QFont font( "Sans", 12 ); QRectF br( r.x() * scale, r.y() * scale, r.width() * scale, r.height() * scale ); QTransform m( 1, 0, 0, 1, wm.dx(), wm.dy() ); p.setTransform( m ); bool is_horiz = wm.m11() && wm.m22(); if( !is_horiz ) p.rotate( -90 ); font.setPixelSize( qRound( br.height() ) ); font.setStyleStrategy( QFont::PreferAntialias ); font.setWeight( font_weight ); p.setFont( font ); QFontMetricsF fm( font ); qreal sw = fm.width( str ); qreal sh = fm.ascent() + fm.descent(); qreal fx = br.width() < sw ? br.width() / sw : 1; qreal fy = br.height() < sh ? br.height() / sh : 1; if( fx != 1 || fy != 1 ) { p.scale( fx, fy ); br = QRectF( br.x() / fx, br.y() / fy, br.width() / fx, br.height() / fy ); } p.drawText( br, flags, str ); p.setTransform( wm ); }
Название: Re: Текст не влазит
Отправлено: Igors от Января 23, 2014, 20:01
Я у себя не подбираю, а сам "сжимаю":
Спасибо, понял. Я сделал простым "врастанием", хз, может медленно будет C++ (Qt) // returns not-zero if font has been changed int FitText( QString & txt, QFont & font, int maxWidth, bool allowCondensed ) { if (QFontMetrics(font).width(txt) < maxWidth) return 0; int result = 0; if (allowCondensed) { int old = font.stretch(); int stretch = 50; if (old > stretch) { font.setStretch(stretch); result = 1; if (QFontMetrics(font).width(txt) < maxWidth) { for (int i = 0; i < 5; ++i) { int mid = (old + stretch) / 2; font.setStretch(mid); if (QFontMetrics(font).width(txt) < maxWidth) stretch = mid; else old = mid; } font.setStretch(stretch); return 1; } } } txt = QFontMetrics(font).elidedText(txt, Qt::ElideRight, maxWidth); return result; }
|