Название: Нарисовать текст Отправлено: 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 Если самый простой тот, который приходит в голову первым, то: А как разбивать? И откуда взять N ?1. Разбить текст на строки, чтобы в первых n - 1 строках было не более N символов. 2. В последней строке нарисовать только elidedText(). Название: 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. Наверное проще никак... Ну ладно, буду допиливать пример. Спасибо за ответы |