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