Russian Qt Forum

Qt => Qt Quick => Тема начата: Qyrychen от Февраль 03, 2016, 14:59



Название: [РЕШЕНО] Не отрабатывает укорачивания текста в TextEdit
Отправлено: 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, то в результате получаем все пустые ячейки кроме первой + сужение работает только в одну сторону, т.е. при увеличении колонки текст не расширяется

Подскажите, пожалуйста как можно решить такую проблему или может кто-то сможет хоть идей накидать?
Заранее спасибо


Название: Re: Не отрабатывает укорачивания текста в TextEdit
Отправлено: BuRn от Февраль 04, 2016, 00:58
Если пофиг на производительность, то первое что пришло в голову это использовать FontMetrics
Бекапишь куда-то в переменнную исходных текст, дальше у FontMetrics есть функция позволяющая узнать сколько по ширине займет твой текст. Берешь новую строку вида "..." и добавляешь в начало по 1 символу и исходного текста, до тех пор, пока метод из FontMetrics не вернет тебе максимальную ширину текста, которая может вместиться в ширину твоего поля


Название: Re: Не отрабатывает укорачивания текста в TextEdit
Отправлено: Racheengel от Февраль 04, 2016, 11:38
Если пофиг на производительность, то первое что пришло в голову это использовать FontMetrics
Бекапишь куда-то в переменнную исходных текст, дальше у FontMetrics есть функция позволяющая узнать сколько по ширине займет твой текст. Берешь новую строку вида "..." и добавляешь в начало по 1 символу и исходного текста, до тех пор, пока метод из FontMetrics не вернет тебе максимальную ширину текста, которая может вместиться в ширину твоего поля

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


Название: [РЕШЕНО] Не отрабатывает укорачивания текста в TextEdit
Отправлено: Qyrychen от Февраль 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)
                    }