Qt 富文本处理

本文介绍了QT中的富文本处理,核心类QTextDocument用于操作富文本文档,它包含文本块、框架、表格、列表等元素。QTextFrame是文档的基本单位,QTextBlock组织文本段落,QTextFragment表示段落中的格式变化。QTextCharFormat用于设定字符格式,QTextTable和QTextList分别用于创建表格和列表,QTextCursor则用于文档的编辑操作。QTextEdit作为富文本编辑器,整合了这些功能并提供了滚动条。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QTextDocument

QT中富文本通常由此类进行操作

富文本文档通常包含:文本块/段落(QTextBlock)、框架(QTextFrame)、表格(QTextTable)、列表(QTextList)等常见元素组成

文档中的基本元素是Frame,frame又包含了诸如block等更低级的元素,通过设置frame的格式,即可设置document中所有元素的排列方式

简单来说,一个document就像一个容器,可以包含block、image等元素,然后通过frame将它们有序的组织起来

层级关系:document->frame/table->block/list->fragment/image->char

而document内部的修改等功能是通过cursor类来完成的

使用方式简单带过,一种是脱离ui组件,仅在代码中使用(如读取一个文件,将其内容转换后输入到document中);一种就是配合ui组件(如textEdit)来可视化编辑

//遍历document中的所有block
QTextBlock currentBlock = docment->begin();
while (currentBlock.isValid()) 
{
   
    //...
    currentBlock = currentBlock.next();
}
//遍历document中的所有元素
QTextFrame * rootFrame = docment->rootFrame();
for (QTextFrame::iterator it = rootFrame->begin(); !(it.atEnd()); ++it)
{
   
    QTextFrame *childFrame = it.currentFrame();
    QTextBlock childBlock = it.currentBlock();

    ...
}
//常用方法
doc2=doc->clone();//创建一个doc的副本(复制)
doc->addResource(type,url,QVariant);//将给出的QVariant添加到doc的资源缓存中,类型为type,以后就可以用url来表示此资源
doc->resource(type,url);//通过给出的url返回对应的资源(QVariant),先在缓存中找,找不到再调用loadResource
doc->setBaseUrl();//设置一个url为前缀,以后所有doc使用的url都会加上这个前缀,就得出了绝对路径

信号槽

//document中的block总数发生变化时发出此信号
void blockCountChanged(int newBlockCount)
//document中内容变化时触发
void contentsChange(int position, int charsRemoved, int charsAdded)
//cursor位置变化时触发
void cursorPositionChanged(const QTextCursor &cursor)

QTextFrame

既然block包含了多个fragment的组合方式,frame就是包含了多个block(以及子frame)的组合方式,可以看作是document中的基本单位

多个子元素存储在子frame中,每个document都有一个rootFrame,保存着所有子frame及其排列方式

//遍历一个frame中的所有元素
for (it = frame->begin(); !(it.atEnd()); ++it) 
{
    
	//每取出一个元素,都要判断是block还是frame,否则会出现block赋值给frame的情况
    QTextFrame *childFrame = it.currentFrame(); 
    QTextBlock childBlock = it.currentBlock(); 
     
    if (childFrame) 
        processFrame(frameElement, childFrame); 
    else if (childBlock.isValid()) 
        processBlock(frameElement, childBlock); 
} 

//常用方法
childFrames()parentFrame
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值