Можно ли в любом случае найти начальную и конечную геометрические позиции текстов, представленных в TextFiled в QML? - PullRequest
0 голосов
/ 05 июня 2019

Я хочу выделить текущий текущий текст в TextField QML, как показано на добавленном ниже изображении. enter image description here

Я знаю о selectAll, но проблема в том, что при добавлении новых текстов предыдущие тексты исчезают. Я знаю, что, вероятно, с TextEdit и TextArea вы, вероятно, можете сделать это, используя QQuickTextDocument, но с этими двумя у меня нет возможности ограничить ввод данных, используя что-то вроде

validator: IntValidator { bottom:lowestInput; top: highestInput}

Итак, можно ли в любом случае выделить текст в TextField без выбора «Все»?

Спасибо.

1 Ответ

0 голосов
/ 05 июня 2019

Когда вы используете 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
    }
}
...