Когда вы используете selectAll
, он будет работать так, как если бы вы выбрали текст мышью. Поэтому, когда пользователь напишет что-то еще, выделенный текст будет удален.
Вам нужно выделить текст, а не выделять его.
Используйте класс QSyntaxHighlither
и элемент TextField
, чтобы выделить шаблон.
Сначала вам нужно создать новый класс, который наследуется от QSyntaxHighlighter
, и переопределить метод highlightBlock()
.
Вы также должны создать новый метод, который будет вызываться из QML. A TextEdit
использует QQuickTextDocument
в качестве текстового документа. Вы должны получить QTextDocument
в нем:
class SyntaxHighlighter: public QSyntaxHighlighter
{
Q_OBJECT
public:
SyntaxHighlighter(QTextDocument* parent=nullptr): QSyntaxHighlighter(parent)
{}
protected:
void highlightBlock(const QString &text) override
{
QTextCharFormat format;
format.setFontWeight(QFont::Bold);
format.setForeground(Qt::white);
format.setBackground(Qt::darkBlue);
QString const pattern("PT 36631");
int index = text.indexOf(pattern);
while (index != -1)
{
setFormat(index, pattern.length(), format);
index = text.indexOf(pattern, index + 1);
}
}
Q_INVOKABLE void setDocument(QQuickTextDocument* document)
{
QSyntaxHighlighter::setDocument(document->textDocument());
}
};
Затем установите маркер в качестве нового свойства контекста в вашем QML:
SyntaxHighlighter* highlighter = new SyntaxHighlighter;
QQuickView *view = new QQuickView;
view->rootContext()->setContextProperty("highlighter", highlighter);
view->setSource(QUrl("qrc:/main.qml"));
view->show();
Теперь вы можете использовать его в своем TextEdit
:
TextEdit {
id: editor
anchors.fill: parent
Component.onCompleted: {
highlighter.setDocument(editor.textDocument)
}
}
Если вам нужно только проверить, является ли вход целым числом в диапазоне, вы можете использовать сигнал textChanged
для проверки значения.
Быстрый пример:
TextEdit {
id: editor
anchors.fill: parent
Component.onCompleted: {
highlighter.setDocument(editor.textDocument)
}
QtObject {
id: d
property string validatedText: ""
}
onTextChanged: {
var lowestInput = 0;
var highestInput = 255;
var integerOnly = parseInt(text);
if (!integerOnly)
{
editor.text = d.validatedText
return
}
if (integerOnly < lowestInput || integerOnly > highestInput)
{
editor.text = d.validatedText
return
}
d.validatedText = editor.text
}
}