У меня есть два требования к пользовательскому элементу Text в QML:
1. Выделите и скопируйте текст
Я хотел бы отобразить текст и разрешить пользователю копировать его, выделив его мышью и скопировав с помощью CTRL+C.
-> Это работает «из коробки», используя элемент TextEdit/TextArea с параметрами «readOnly» и «selectByMouse», для которых установлено значение true.
2. Отрегулируйте высоту строки текста.
Я хотел бы иметь возможность регулировать высоту строки текста.
-> Кажется, НЕВОЗМОЖНО с TextEdit/TextArea.
-> Можно настроить в обычном текстовом элементе, установив «lineHeight». Но текст не может быть выбран и скопирован пользователем.
Есть ли способ настроить любой из элементов для выполнения недостающей задачи?
Каково типичное решение для этого? Кажется, это достаточно простое требование, но я не могу найти его нигде обсуждаемым.
Редактировать:
Судя по комментарию SMR, я проверил подход к настройке режима RichText и изменению содержимого для установки высоты строки. Это строка richtext многострочного текста:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name = "qrichtext" content = "1" /><meta charset = "utf-8" /><style type = "text/css">
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: "\2610"; }
li.checked::marker { content: "\2612"; }
</style></head><body style = " font-family:'Segoe UI'; font-size:15px; font-weight:400; font-style:normal;">
<p style = " margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Line one Line two Line three</p></body></html>
Я расширил стиль абзацев на высоту строки внутри «Component.onCompleted()»:
text.replace("text-indent:0px;", "text-indent:0px; line-height:" + desiredLineHeightInPx + "px;")
Это работает, но над первой строкой также появляются пробелы. Я пытался противодействовать этому, установив отрицательное верхнее поле, но безуспешно:
var marginToCounteractLineHeight = desiredLineHeightInPx / 2
newText = text.replace("<p style=\" margin-top:0px;", "<p style=\" margin-top:-" + marginToCounteractLineHeight +"px;")
На данный момент я решил использовать элемент Text и поместил MouseArea сверху, чтобы перенести текст в невидимый TextEdit, в котором я затем выделяю все и копирую в буфер обмена (за которым следует анимация, информирующая пользователя):
MouseArea {
acceptedButtons: Qt.LeftButton
onClicked {
// Copy to TextEdit
myInvisibleTextEdit.text = myText.text
myInvisibleTextEdit.selectAll()
myInvisibleTextEdit.copy()
copyAnimation.start()
}
}





[ПЕРЕПИСАТЬ]
В вашем TextEdit уже должно быть реализовано сочетание клавиш «CTRL+C». Если он не работает, вы можете объявить для него действие "CTRL+C". Что касается управления высотой строки TextEdit, вы можете установить textFormat: Text.RichText и предоставить тело HTML со стилем, установленным на line-height:2.
TextEdit {
id: textEdit
text: `<body style = "line-height:2">Hello World<br>
Mary had a little lamb</body>`
textFormat: Text.RichText
font.pointSize: 12
Action {
text: "copy"
shortcut: "Ctrl+C"
onTriggered: textEdit.copy()
}
Component.onCompleted: select(3, 10)
}
Вы можете Попробовать онлайн!
Спасибо за подробное объяснение. Но мне бы хотелось, чтобы высота строки всегда увеличивалась для определенных TextEdits, а не только для выделенного текста.
Попробуйте
<style>*{line-height:50px;}</style>в режимеRichText. (Примечание. Чтобы это вступило в силу, вам следует обернуть текст внутри тега html.)