QTextDocument、QSyntaxHighlighter

QTextDocument

一、描述

此类用来储存结构化的富文本文档。

二、类型成员

1、enum QTextDocument::FindFlag:此枚举描述查找函数可用的选项。这些选项可以用“|”组合:

  • FindBackward:向后搜索。
  • FindCaseSensitive:不区分大小写。
  • FindWholeWords:查找仅匹配完整的单词。

2、enum QTextDocument::MetaInformation:此枚举描述了可以添加到文档中的不同类型的元信息。

  • DocumentTitle:文档的标题。
  • DocumentUrl:文档的url。loadResource() 函数在加载相关资源时使用此url作为基础。
  • CssMedia:此值用于在调用 setHtml() 时从指定的CSS样式表中选择相应的“@media”规则。

3、enum QTextDocument::ResourceType:此枚举描述可由 loadResource() 函数或QTextBrowser::setSource() 加载的资源类型。

  • UnknownResource:未加载资源,或资源类型未知。
  • HtmlResource:资源包含HTML。
  • ImageResource:资源包含图像数据。
  • StyleSheetResource:资源包含CSS。
  • MarkdownResource:资源包含Markdown。
  • UserResource:用户定义的资源类型的第一个可用值。

三、属性成员

1、baseUrl : QUrl

用于解析文档中相对资源URL的基URL。

资源URL被解析为与基URL的目标位于同一目录中,即着路径中最后一个“/”之后的任何部分都将被忽略。

2、blockCount : const int

文档中文本块的数量。

此属性的值在具有表格(QTextTable)或框架(QTextFrame)的文档中未定义。

默认情况下,如果已定义,则值为1。

3、defaultFont : QFont

用于显示文档文本的默认字体。

4、defaultStyleSheet : QString

默认样式表,应用于插入到文档中的所有新HTML格式文本(使用 setHtml() 或 QTextCursor::insertHtml() 插入)。

更改默认样式表不会对文档的现有内容产生任何影响。

5、defaultTextOption : QTextOption

文档中所有 QTextLayout 的默认文本选项。

创建 QTextBlocks 时,将在其 QTextLayout 上设置 defaultTextOption。

这可用来设置文档的全局属性,例如默认换行模式。

6、documentMargin : qreal

文档周围的边距。默认值为4。

7、indentWidth : qreal

文本列表(QTextList)和文本块(QTextBlock)缩进的宽度。默认为40。

8、layoutEnabled : bool

每次更改后 QTextDocument 是否应重新计算布局。默认为 true。

为 true,则对文档的任何更改都会触发布局。

为 false,则进行多次更改在最后只布局一次。

9、maximumBlockCount : int

文档文本块的最大数目。如果文档中所有的文本块超过此数目,则将从文档开头删除块。

负值或0表示无限制。默认值为0。此属性在具有表或框架的文档中未定义。

10、modified : bool

文档是否已被用户修改。默认为false。

11、pageSize : QSizeF

布置文档的页面大小。单位由基础绘制设备确定。在屏幕上绘制时,尺寸以逻辑像素为单位,在打印机上作画时以点数(1/72英寸)为单位。

12、size : const QSizeF

文档的实际大小,相当于 documentLayout()->documentSize()。可以通过设置文本宽度(textWidth)或设置页面大小(pageSize)来更改文档的大小。

13、textWidth : qreal

文档中文本的首选宽度。当文本的宽度大于此属性值时,如果文本可以拆分则将其拆分为多行。

若设置为-1,则只有当通过显式换行符或新段落强制换行时文本才会被拆分。默认值为-1。

 

14、undoRedoEnabled : bool

是否为此文档启用了撤消/回撤。默认为true。

如果禁用,将清除撤消堆栈,并且不会向其中添加任何项。

15、useDesignMetrics : bool

文档是否使用字体的 QFontMetrics 来提高文本布局的准确性。默认为 false。

设置为 false 则根据 QAbstractTextDocumentLayout::setPaintDevice() 上设置的绘制设备参数布局。

四、成员函数

1、【信号】void blockCountChanged(int newBlockCount)

文档中的文本块总数发生变化时发出此信号。

2、【信号】void contentsChange(int position, int charsRemoved, int charsAdded)

文档内容发生变化时发出此信号。例如插入或删除文本或应用格式时。

position 为发生更改的字符位置、charsRemoved 为删除的字符数、charsAdded 为添加的字符数。

3、【信号】void cursorPositionChanged(const QTextCursor &cursor)

光标的位置由于编辑操作而改变时发出此信号。更改的光标为 cursor。

4、【信号】void modificationChanged(bool changed)

文档内容以影响修改状态的方式更改时发出此信号。

5、void redo() / void undo()

回撤/撤消文档上的最后一次编辑操作。

void redo(QTextCursor *cursor) / void undo(QTextCursor *cursor)

如果可以回撤 / 撤消,则回撤 / 撤消文档上的最后一次编辑操作。cursor 位于回撤 / 撤消编辑操作的位置的末尾。

int availableRedoSteps() / int availableUndoSteps()

可用的回撤 / 撤销步骤数。

bool isRedoAvailable() / bool isUndoAvailable()

是否可以回撤 / 撤销。

6、【信号】void redoAvailable(bool available)

回撤操作的可用性变化时发出此信号。

7、【信号】void undoCommandAdded()

向文档添加可撤消内容时都会发出此信号。

8、void addResource(int type, const QUrl &name, const QVariant &resource)

使用 type 和 name 作为标识符,将资源 resource 添加到资源缓存中。type 是 ResourceType 中的值。

将图像添加为资源,从文档中引用它:

 

9、void adjustSize()

将文档调整为合理大小。

qreal idealWidth()

返回文本文档的理想宽度。理想宽度是文档的实际使用宽度,不考虑可选对齐方式。

10、QList<QTextFormat> allFormats()

返回文档中使用文本格式列表。

11、QTextBlock begin() / QTextBlock firstBlock()

文档的第一个文本块。

QTextBlock end()

返回的文本块无效,表示文档中最后一个块之后的块。

for (QTextBlock it = doc->begin(); it != doc->end(); it = it.next())
std::cout << it.text().toStdString() << "\n";
QTextBlock findBlock(int pos)

返回包含第 pos 个字符的文本块。

QTextBlock lastBlock()

返回文档最后一个有效的文本块。

QTextBlock findBlockByLineNumber(int lineNumber)

返回第 lineNumber 行的文本块。从0开始算。

 

QTextBlock findBlockByNumber(int blockNumber)

返回第 blockNumber 个文本块。

12、QChar characterAt(int pos)

返回位置pos处的字符,如果pos超出范围,则返回空字符。

13、int characterCount()

返回此文档的字符数。

14、void clear()

清除文档。

15、void clearUndoRedoStacks(QTextDocument::Stacks stacksToClear = UndoAndRedoStacks)

清除指定的堆栈。

16、QTextDocument * clone(QObject *parent = nullptr)

创建一个新的QTextDocument,它是此文本文档的副本。parent 是返回文本文档的父级。

17、void drawContents(QPainter *p, const QRectF &rect = QRectF())

使用画笔p绘制文档的内容,剪切为 rect 范围的内容。如果 rect 是一个空矩形,那么将不剪切。

18、QTextCursor find(const QString &subString, const QTextCursor &cursor, QTextDocument::FindFlags options = FindFlags())

查找文档中的子字符串subString。搜索从给定光标 cursor 的位置开始。

如果找到了subString,则返回具有所选匹配项的光标;否则返回空光标。

默认情况下,搜索不区分大小写,可以匹配文档中任何位置的文本。

QTextCursor find(const QString &subString, int position = 0, QTextDocument::FindFlags options = FindFlags())

搜索从给定位置 position 开始。如果 position 为 0,则搜索从文档开头开始。

QTextCursor find(const QRegularExpression &expr, int from = 0, QTextDocument::FindFlags options = FindFlags())

搜索从给定的 from 位置开始。

QTextCursor find(const QRegularExpression &expr, const QTextCursor &cursor, QTextDocument::FindFlags options = FindFlags())

搜索从给定光标 cursor 的位置开始。

19、int lineCount()

返回文档的行数。

20、QVariant loadResource(int type, const QUrl &name)

从具有给定名称的资源加载指定类型的数据。type 是 ResourceType 的值。

QVariant resource(int type, const QUrl &name)

返回指定类型的数据。如果在缓存中找不到资源,则调用 loadResource() 尝试加载资源。

21、int pageCount()

返回此文档中的页数。

 

22、void print(QPagedPaintDevice *printer)

打印文档。

23、int revision()

返回文档的修订版本值。当编辑文档时,修订版本的值会增加。

24、QTextFrame * rootFrame()

返回文档的根框架。

25、void setBaselineOffset(qreal baseline)

设置在文档布局中使用的字体高度的百分比的基线。默认值为0。正值将文本上移相应的百分比,负值则向下移动。

 

 

26、void setDefaultCursorMoveStyle(Qt::CursorMoveStyle style)

设置默认光标移动样式。

  • Qt::LogicalMoveStyle:在从左到右的文本块内,按左箭头键时减少光标位置,按右箭头键时增加光标位置。如果文本块是从右到左的,则应用相反的行为。
  • Qt::VisualMoveStyle:按下左箭头键将始终使光标向左移动,无论文本的书写方向如何。 按右箭头键将始终使光标向右移动。

27、void setHtml(const QString &html) / void setPlainText(const QString &text)

替换文档的全部内容。调用此函数时,将重置撤消/回撤历史记录。

QString toHtml()

返回包含文档的HTML表示形式的字符串。

文档内容指定其编码为UTF-8。如果要将返回的 html 字符串转换为字节数组以通过网络传输或保存到磁盘时,应使用 QString::toUtf8() 将字符串转换为 QByteArray。

QString toPlainText()

返回文档中包含的纯文本。与 toRawText() 相比,此函数将用 ASCII 字符替换某些 unicode 字符。

QString toRawText()

返回文档中包含的原始文本,不包含任何格式信息。

28、void setMarkdown(const QString &markdown, QTextDocument::MarkdownFeatures features = MarkdownDialectGitHub)

使用 Markdown 格式文本替换文档的全部内容。调用此函数时,将重置撤消/回撤历史记录。

可以通过 features 参数启用或禁用解析器的某些功能:

  • Markdown NoHTML:Markdown文本中的任何HTML标记都将被丢弃
  • MarkdownDialectCommonMark:解析器仅支持 CommonMark 标准化的功能
  • MarkdownDialectGitHub:默认值,解析器支持GitHub特性
QString toMarkdown(QTextDocument::MarkdownFeatures features = MarkdownDialectGitHub)

返回含具有给定特性的文档的 Markdown 表示形式的字符串。

29、void setMetaInformation(QTextDocument::MetaInformation info, const QString &string)

设置文档元信息。

30、void setSubScriptBaseline(qreal baseline) / void setSuperScriptBaseline(qreal baseline)

设置下标 / 上标要在文档布局中使用的字体高度的百分比。

默认值:下标为16.67%(高度的1/6);上标为 50%(高度的1/2)。

 本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

QSyntaxHighlighter

一、描述

此类用于自定义语法高亮显示规则,是用于实现 QTextDocument 文本高亮显示的基类。

要自定义语法高亮显示,必须子类化 QSyntaxHighlighter 并重新实现 highlightBlock()。此函数将在合适的时机自动被调用。

highlightBlock() 函数将格式设置应用于传递给它的文本。setFormat() 函数将给定的QTextCharFormat 应用于当前文本块。例如:

class MyHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
MyHighlighter(QTextDocument *parent = nullptr)
: QSyntaxHighlighter(parent)
{
}

protected:
void highlightBlock(const QString &text) override;
};

void MyHighlighter::highlightBlock(const QString &text)
{
QTextCharFormat matchFormat;
matchFormat.setFontWeight(QFont::Bold);
matchFormat.setForeground(Qt::red);

static QRegularExpression expression{"\\bname=[A-Za-z]+\\b"};
QRegularExpressionMatchIterator i = expression.globalMatch(text);
while (i.hasNext())
{
QRegularExpressionMatch match = i.next();
setFormat(match.capturedStart(), match.capturedLength(), matchFormat);
}
}
MyHighlighter *highlighter = new MyHighlighter(ui->textEdit->document());

 

编辑框中匹配正则表达式的内容被设置为指定的格式。

二、成员函数

1、void rehighlight()

将高亮显示重新应用于整个文档。

2、void rehighlightBlock(const QTextBlock &block)

将高亮显示重新应用于文本块。

3、QTextBlock currentBlock()

当前文本块。

4、void highlightBlock(const QString &text)

高亮显示给定的文本块。富文本引擎在必要时调用此函数,即在已更改的文本块上调用。

5、void setCurrentBlockUserData(QTextBlockUserData *data)

QTextBlockUserData 类用于将自定义数据与文本块相关联。

此函数将 data 附着到当前文本块。

struct info
{
QString name;
int age;
};

struct BlockData : public QTextBlockUserData
{
QList<info> infoList;
};

class MyHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
MyHighlighter(QTextDocument *parent = nullptr)
: QSyntaxHighlighter(parent)
{
}

protected:
void highlightBlock(const QString &text) override;
};


void MyHighlighter::highlightBlock(const QString &text)
{
QTextCharFormat matchFormat;
matchFormat.setFontWeight(QFont::Bold);
matchFormat.setForeground(Qt::red);

static QRegularExpression expression{"\\bname=[A-Za-z]+\\b"};
QRegularExpressionMatchIterator i = expression.globalMatch(text);
int number{1};
while (i.hasNext())
{
QRegularExpressionMatch match = i.next();
setFormat(match.capturedStart(), match.capturedLength(), matchFormat);

QList<info> infoList;

info data;
data.name = QString("name%1").arg(number);
data.age = number;
infoList << data;
++number;

data.name = QString("name%1").arg(number);
data.age = number;
infoList << data;
++number;

BlockData * bd = new BlockData;
bd->infoList = infoList;
setCurrentBlockUserData(bd);
}
}

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
MyHighlighter *highlighter = new MyHighlighter(ui->textEdit->document());
}

Widget::~Widget()
{
delete ui;
}

void Widget::on_pushButton_clicked()
{
QTextBlock currentBlock = ui->textEdit->document()->begin();
while (currentBlock.isValid())
{
currentBlock = currentBlock.next();
if(auto bd = static_cast<BlockData*>(currentBlock.userData()))
{
qDebug()<<"xxx";
for(const info &data : bd->infoList)
{
qDebug()<<data.name;
qDebug()<<data.age;
}
}
}
}

6、void setFormat(int start, int count, const QTextCharFormat &format)

void setFormat(int start, int count, const QColor &color)

此函数应用于语法高亮显示的当前文本块(即传递给 highlightBlock() 函数的文本)。

指定的格式 format 从 start 位置应用于文本,长度为 count 个字符(如果count为0,则不执行任何操作)。

通过此函数设置的格式不会修改文档本身。

void setFormat(int start, int count, const QFont &font)
void setFormat(int start, int count, const QColor &color)

指定的字体 / 颜色从 start 位置应用于当前文本块,长度为 count 个字符。

当前文本块的其他属性(例如字体和背景色)将重置为默认值。

7、void setCurrentBlockState(int newState) / int previousBlockState()

文本块有一个数值表示其状态,默认为为-1。

 

  • setCurrentBlockState() 设置当前文本块的状态为一个数值。
  • previousBlockState() 返回语法高亮显示当前块之前的文本块的结束状态。

 

状态主要用于处理多个文本块的使用同一个样式的情况(如多行注释)。

这种情况需要知道上一个文本块的结束状态。在 highlightBlock() 实现中,可以使用 previousBlockState() 查询上一个文本块的结束状态。解析块后,可以使用setCurrentBlockState() 保存最后一个状态。

以下代码片段来着官方示例:语法高亮器

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

原原文链接:https://blog.csdn.net/kenfan1647/article/details/128578980

原文链接:https://blog.csdn.net/kenfan1647/article/details/128578980

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值