Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Января 23, 2014, 10:01



Название: Текст не влазит
Отправлено: 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;
}