我正在尝试创建以下示例的最小版本:https://doc.qt.io/qt-5/qtquickcontrols-texteditor-example.html
我使用以下方法创建了一个DocumentHandler
类:
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代码调用此方法时
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
是否正确。这就是示例中所做的,但我很难找到与我的代码有什么不同之处。
发布于 2022-09-23 18:28:48
看看https://doc.qt.io/qt-5/qml-qtquick-textedit.html#textFormat-prop,我会用textFormat: TextEdit.RichText
代替textFormat: Text.RichText
发布于 2022-09-23 22:37:30
不久前,我为QSyntaxHighter类编写了一个包装器。这比您需要的要多,但是,它包含以下元素:
中的文本颜色和格式
请注意,该示例适用于TextEdit
而不是TextArea
。
#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);
// ...
};
你可以这样使用它:
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
}
要获得完整的源代码,请参阅:
https://stackoverflow.com/questions/73830468
复制相似问题