Russian Qt Forum
Ноябрь 23, 2024, 11:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

Сообщений: 11445


Просмотр профиля
« : Март 21, 2015, 12:03 »

Добрый день

Какой есть простой способ вывести текст если задается ширина + число линий (3 и 2 на аттаче). Если не влезает - показать .. (elided)

Спасибо
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #1 : Март 21, 2015, 15:15 »

Если самый простой тот, который приходит в голову первым, то:
1. Разбить текст на строки, чтобы в первых n - 1 строках было не более N символов.
2. В последней строке нарисовать только elidedText().
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 21, 2015, 15:58 »

Если самый простой тот, который приходит в голову первым, то:
1. Разбить текст на строки, чтобы в первых n - 1 строках было не более N символов.
2. В последней строке нарисовать только elidedText().
А как разбивать? И откуда взять N ?
Записан
Bepec
Гость
« Ответ #3 : Март 21, 2015, 16:04 »

 <QFontMetrics> позволяет узнать размер получаемой надписи.
Соответственно мы берём строку и пробегаемся по ней, до тех пор, пока размер получаемой надписи будет вписываться в нужный нам размер.
Одна строка у нас готова.
Далее по аналогии.
Последняя строка нуждается в двух проходах - сначала узнаем какое количество символов вписывается, потом добавляем к строке .. и убираем по 1 символу до тех пор, пока не будет вписываться.

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 21, 2015, 16:21 »

<QFontMetrics> позволяет узнать размер получаемой надписи.
Соответственно мы берём строку и пробегаемся по ней, до тех пор, пока размер получаемой надписи будет вписываться в нужный нам размер.
Одна строка у нас готова.
Далее по аналогии.
Последняя строка нуждается в двух проходах - сначала узнаем какое количество символов вписывается, потом добавляем к строке .. и убираем по 1 символу до тех пор, пока не будет вписываться.
Т.е. действовать по классике
Цитировать
Ударим автопробегом по бездорожью и разгильояйству
Ну пока не дошло как. По букве убирать, что ли? А с пробелами как? Какой-то совсем хилый велосипед выходит.

И точки самому добавлять не надо, для этого есть  QFontMetrics::elidedText, но он делает это для одной строки.
Записан
Bepec
Гость
« Ответ #5 : Март 21, 2015, 16:24 »

По символу. Пробел тоже символ. И да, он тоже занимает место при отрисовке Улыбающийся

Велосипед выходит стабильный и расширяемый. Можно спокойно будет заменять концовки, количество строк и прочая и прочая. Но это уже дополнительные плюшки.

PS проще и стабильнее, чем посимвольный проход вы не придумаете Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 21, 2015, 17:14 »

PS проще и стабильнее, чем посимвольный проход вы не придумаете Улыбающийся
А тут не придумывать надо а владеть инструментарием. Вот нашел класс QTextLayout и даже похожий примерчик где QLabel вписявают. Но как-то это сложновато....
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #7 : Март 21, 2015, 20:51 »

Я нечто похожее делал, но ширина была в символах ибо шрифт был моноширинный, поэтому написал N символов. Но у Вас наверное не так, поэтому можно использовать QFontMetrics::width ( const QString & text, int len = -1 ) и идти не по символам а даже по словам. Сначала у Вас, строка номер один пустая. Берете первое слово, если  QFontMetrics::width ( const QString & это слово + строка (которая пока пустая)) меньше Ваша_Ширина_Строки, тогда делаете первая_строка.append(пробел + слово). Если в какой-то момент условие не выполняется, первая строка сформирована, вторая строка инициализируется пустой и в нее добавляются слова. Всего таких строк нужно (m - 1), где m у Вас 3 или 2. А к оставшемуся тексту применяется
Код:
QString QFontMetrics::elidedText ( const QString & text, Qt::TextElideMode mode, int width, int flags = 0 )
и получаете последнюю строку с троеточием на конце.
Прошу прощения, что словами и возможно плохо обьясняю. Не факт что это самый-самый эффективный алгоритм.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 22, 2015, 09:07 »

Я нечто похожее делал, но ширина была ..
Я понял что Вы предлагаете. Разумно, но ручная работа. Вот похожий пример. Тоже "не пара строк" и там еще придется рисовать selection.  Наверное проще никак... Ну ладно, буду допиливать пример. Спасибо за ответы
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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