Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Март 21, 2015, 12:03



Название: Нарисовать текст
Отправлено: Igors от Март 21, 2015, 12:03
Добрый день

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

Спасибо


Название: Re: Нарисовать текст
Отправлено: torwig от Март 21, 2015, 15:15
Если самый простой тот, который приходит в голову первым, то:
1. Разбить текст на строки, чтобы в первых n - 1 строках было не более N символов.
2. В последней строке нарисовать только elidedText().


Название: Re: Нарисовать текст
Отправлено: Igors от Март 21, 2015, 15:58
Если самый простой тот, который приходит в голову первым, то:
1. Разбить текст на строки, чтобы в первых n - 1 строках было не более N символов.
2. В последней строке нарисовать только elidedText().
А как разбивать? И откуда взять N ?


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



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

И точки самому добавлять не надо, для этого есть  QFontMetrics::elidedText, но он делает это для одной строки.


Название: Re: Нарисовать текст
Отправлено: Bepec от Март 21, 2015, 16:24
По символу. Пробел тоже символ. И да, он тоже занимает место при отрисовке :)

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

PS проще и стабильнее, чем посимвольный проход вы не придумаете :)


Название: Re: Нарисовать текст
Отправлено: Igors от Март 21, 2015, 17:14
PS проще и стабильнее, чем посимвольный проход вы не придумаете :)
А тут не придумывать надо а владеть инструментарием. Вот нашел класс QTextLayout и даже похожий примерчик где QLabel вписявают. Но как-то это сложновато....


Название: Re: Нарисовать текст
Отправлено: torwig от Март 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 )
и получаете последнюю строку с троеточием на конце.
Прошу прощения, что словами и возможно плохо обьясняю. Не факт что это самый-самый эффективный алгоритм.


Название: Re: Нарисовать текст
Отправлено: Igors от Март 22, 2015, 09:07
Я нечто похожее делал, но ширина была ..
Я понял что Вы предлагаете. Разумно, но ручная работа. Вот похожий пример (http://doc.qt.io/qt-5/qtwidgets-widgets-elidedlabel-example.html). Тоже "не пара строк" и там еще придется рисовать selection.  Наверное проще никак... Ну ладно, буду допиливать пример. Спасибо за ответы