首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修改QML TextArea元素的TextArea

修改QML TextArea元素的TextArea
EN

Stack Overflow用户
提问于 2022-09-23 16:13:01
回答 2查看 64关注 0票数 1

我正在尝试创建以下示例的最小版本:https://doc.qt.io/qt-5/qtquickcontrols-texteditor-example.html

我使用以下方法创建了一个DocumentHandler类:

代码语言:javascript
运行
复制
class DocumentHandler : public QObject {
    Q_OBJECT
    QML_ELEMENT

public:
    Q_INVOKABLE void changeFormat(QQuickTextDocument *doc) {
        QTextCursor cursor(doc->textDocument());
        cursor.select(QTextCursor::Document);
        QTextCharFormat format;
        format.setFontItalic(true);
        cursor.mergeBlockCharFormat(format);
    }
}

不幸的是,当我从以下QML代码调用此方法时

代码语言:javascript
运行
复制
import DocumentTest 1.0
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Document Test")

    TextArea {
        id: textArea

        focus: true
        anchors.fill: parent
        wrapMode: Text.Wrap
        selectByMouse: true
        text: "Another day in paradise"
        onReleased: {
            document.changeChar(textDocument);
        }
        textFormat: Text.RichText
    }

    DocumentHandler {
        id: document
    }
}

我在下面一行崩溃了:https://github.com/qt/qtbase/blob/5.15.2/src/gui/text/qtextoption.h#L118

我在文档中看到QQuickTextDocument::textDocument()是只读的,我不能修改它的内部状态,所以我想知道使用QTextCursor是否正确。这就是示例中所做的,但我很难找到与我的代码有什么不同之处。

EN

回答 2

Stack Overflow用户

发布于 2022-09-23 18:28:48

看看https://doc.qt.io/qt-5/qml-qtquick-textedit.html#textFormat-prop,我会用textFormat: TextEdit.RichText代替textFormat: Text.RichText

票数 0
EN

Stack Overflow用户

发布于 2022-09-23 22:37:30

不久前,我为QSyntaxHighter类编写了一个包装器。这比您需要的要多,但是,它包含以下元素:

  • 控制TextEdit
  • 链接到TextEdit的textDocument属性

中的文本颜色和格式

请注意,该示例适用于TextEdit而不是TextArea

代码语言:javascript
运行
复制
#include <QObject>
#include <QTextDocument>
#include <QSyntaxHighlighter>
#include <QQuickTextDocument>
class SyntaxHighlighter : public QSyntaxHighlighter
{
    Q_OBJECT
    Q_PROPERTY(QQuickTextDocument* textDocument READ textDocument WRITE setTextDocument NOTIFY textDocumentChanged)
public:
    SyntaxHighlighter(QObject* parent = nullptr);
    Q_INVOKABLE void setFormat(int start, int count, const QVariant& format);
    // ...
};

你可以这样使用它:

代码语言:javascript
运行
复制
TextEdit {
    id: textEdit
}

SyntaxHighlighter {
    textDocument: textEdit.textDocument
    onHighlightBlock: {
        let rx = /[A-Za-z]/g;
        let m;
        while ( ( m = rx.exec(text) ) !== null ) {
            let keywords = [
                'import', 'function', 'bool', 'var',
                'int', 'string', 'let', 'const', 'property',
                'if', 'continue', 'for', 'break', 'while',
            ];
            if (keywords.includes(m[0])) {
                setFormat(m.index, m[0].length, keywordFormat);
                continue;
            }
        }
    }
}

TextCharFormat {
    id: keywordFormat
    foreground: "#808000"
    font.pointSize: 12
    font.bold: true; font.italic: true
}

要获得完整的源代码,请参阅:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73830468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档