Russian Qt Forum
Августа 26, 2025, 15:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Текст не влазит  (Прочитано 4052 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Января 23, 2014, 10:01 »

Добрый день

Есть строка txt но ее вывод ограничен шириной maxWidth. Разумеется задан текущий шрифт. Требуется:

- если строка влазит, просто вывести ее текущим шрифтом (с этим нет проблем). Иначе
- попытаться вывести строку тем же, но более сжатым шрифтом. Иначе (все равно не влазит)
- отрубать конец строки и добавлять ... (многоточие) до тех пор пока не влезет

Как это сделать избегая утомительной ручной работы?

Спасибо 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Января 23, 2014, 10:25 »

- отрубать конец строки и добавлять ... (многоточие) до тех пор пока не влезет
Код
C++ (Qt)
QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 )

И о каком контексте идёт речь?
Записан

Qt 5.11/4.8.7 (X11/Win)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Января 23, 2014, 10:34 »

- QFontMetrics::width для обычного шртфта если не влазит, то
- QFontMetrics::elidedText для сжатого шрифта.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Января 23, 2014, 10:43 »

И о каком контексте идёт речь?
Произвольном, рисуем через QPainter

Код
C++ (Qt)
QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 )
Спасибо, какая прелесть! А сжатие (condensed) все-таки самому подбирать? (я конечно руками уже сделал, но хотелось "попастись"  Улыбающийся)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Января 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 );
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Января 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;
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 20.