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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Не отрабатывает укорачивания текста в TextEdit  (Прочитано 5106 раз)
Qyrychen
Гость
« : Февраль 03, 2016, 14:59 »

Доброго времени суток!
Немного предистории:
Есть QML модель и QML TableView.
Для отображения колонок используется делегат с элементом TextEdit (именно этот элемент используется т.к. в дальнейшем необходимо будет реализовывать подсветку с помощью класса QSyntaxHighlighter). В TextEdit отключена возможность переноса слов (получается всегда одна строка только) и при уменьшении ширины столбца нужно обрезать текст и добавлять троеточие. Само по себе свойство elide или подобное у TextEdit отсутствует

Нашел интересную возможность получать обрезанный текст при помощи класса TextMetrics (http://doc.qt.io/qt-5/qml-qtquick-textmetrics.html#width-prop)
Использую я его в слоте внутри TextEdit
Код:
onWidthChanged: {
                        textMetrics.text = delegateTextEdit.text
                        textMetrics.elideWidth = delegateTextEdit.width - 10
                        var str = textMetrics.elidedText
                        console.debug(str)

                        //delegateTextEdit.text = str
                    }

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

Подскажите, пожалуйста как можно решить такую проблему или может кто-то сможет хоть идей накидать?
Заранее спасибо
« Последнее редактирование: Февраль 04, 2016, 18:45 от Qyrychen » Записан
BuRn
Гость
« Ответ #1 : Февраль 04, 2016, 00:58 »

Если пофиг на производительность, то первое что пришло в голову это использовать FontMetrics
Бекапишь куда-то в переменнную исходных текст, дальше у FontMetrics есть функция позволяющая узнать сколько по ширине займет твой текст. Берешь новую строку вида "..." и добавляешь в начало по 1 символу и исходного текста, до тех пор, пока метод из FontMetrics не вернет тебе максимальную ширину текста, которая может вместиться в ширину твоего поля
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Февраль 04, 2016, 11:38 »

Если пофиг на производительность, то первое что пришло в голову это использовать FontMetrics
Бекапишь куда-то в переменнную исходных текст, дальше у FontMetrics есть функция позволяющая узнать сколько по ширине займет твой текст. Берешь новую строку вида "..." и добавляешь в начало по 1 символу и исходного текста, до тех пор, пока метод из FontMetrics не вернет тебе максимальную ширину текста, которая может вместиться в ширину твоего поля

Топорненько как-то, товарищи Улыбающийся
Есть такая функция: QFontMetrics::maxWidth()
Вот она может сразу сказать, сколько символов как минимум поместится.
Надо только посадить нужный фонт и заданную "ширину" поделить на результат данной функции.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Qyrychen
Гость
« Ответ #3 : Февраль 04, 2016, 17:55 »

Спасибо всем откликнувшимся. Проблема, как оказалось, была в том, что при первичной загрузке некоторые элементы приходили пустыми. Проблему решил следующим образом

Код:
TextMetrics {
            id: textMetrics
            elide: Text.ElideRight

            function getElidedText(originalText, maxWidth){
                if(originalText != undefined){
                    text = originalText
                    elideWidth = maxWidth
                    return elidedText
                }
            }
        }

TextEdit{
//...
                    wrapMode: Text.NoWrap
  
                    onWidthChanged: {
                        text = textMetrics.getElidedText(styleData.value, width)
                    }

                    onVisibleChanged: {
                        text = textMetrics.getElidedText(styleData.value, width)
                    }
« Последнее редактирование: Февраль 04, 2016, 18:42 от Qyrychen » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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