富文本(Rich Text)或富文本格式,简单的讲就是在文档中可以使用多种格式,比如字体颜色、图片、表格等。
Qt对富文本的处理分为编辑操作和只读操作。编辑操作使用基于光标的一些接口函数,更好的模拟用户操作,更加容易理解,且不会丢失底层的文档框架。对于文档概览,使用了只读的分层次的接口函数,有利于文档的检索和输出。

QTextDocument 是结构化富文本文档的容器,为样式文本和各种类型的文档元素(如列表、表格、框架和图像)提供支持。它们可以创建用于QTextEdit,也可以独立使用。
头文件:#include
构造函数:

- QTextDocument *docment=new QTextDocument;//创建文档容器
- QTextDocument *docment1=ui->textEdit->document();//获取一个textEdit的文档
常用的函数:
| isEmpty() | 判断文档是否为空 |
| lineCount() | 返回文档行数 |
| pageCount() | 返回文档页数 |
| rootFrame() | 返回根框架 |
| size() | 返回文档大小 |
| begin() end() | 迭代器 |
| find() | 查找 |
| fristBlock() | 返回第一个文本块 |
| lastBlock() | 返回最后一个文本块 |
| blockCount() | 文本块个数 |
| setDefaultFont() | 设置默认字体 |
| setDocumentMargin() | 设置外边距 |
| setIndentWidth() | 设置缩进宽度 |
| setModified(bool) | 设置文档是否保存文档被用户修改 |
| 信号:contentsChange() | 监视文档内容是否被修改 |
一些函数的使用:
- ui->textEdit->setFont(QFont("宋体",12));//设置字体和字体大小
- ui->textEdit->setTextColor(Qt::red);//设置字体颜色
- ui->textEdit->setTextBackgroundColor(Qt::blue);//设置背景颜色
- ui->textEdit->setCursorWidth(2);//设置光标宽度
- ui->textEdit->setLineWrapMode(QTextEdit::FixedColumnWidth);//设置换行模式
- ui->textEdit->setLineWrapColumnOrWidth(10);//设置10个字符自动换行
- ui->textEdit->document()->isEmpty();//判断是否textEdit是否为空的方法
-
-
- ui->textEdit->setText("1111111111111111111111111111111111111111111111");
- QTextDocument *docment1=ui->textEdit->document();//获取一个textEdit的框架
- qDebug()<<"行数:"<<docment1->lineCount();//返回行数
- if(docment1->isEmpty())
- {
- qDebug()<<"空";
- }
- docment1->setDocumentMargin(10);//设置外边距
- qDebug()<<"字节块的个数:"<<docment1->blockCount();
- docment1->setIndentWidth(10);//设置缩进距离


文本框架将一个或多个文本块组合在一起,提供比段落更大的结构层。帧的格式指定其在屏幕上的呈现和定位方式。它不直接指定其中文本格式的行为,但对其子项的布局提供约束。
构造函数:
![]()
常用的函数:
| begin(),end() | 迭代器 |
| childFrames() | 获得子框架 |
| parentFrame() | 返回父框架 |
| setFrameFromat() | 设置框架格式 |
- QTextEdit *text=new QTextEdit(this);
- QTextDocument *document=text->document();//获取textEdit的文本
- QTextFrame* frame=document->rootFrame();//获取根框架
文本框架格式的示意图:

构造函数:
![]()
获取一个textEdit的框架:
- QTextEdit *text=new QTextEdit(this);
- QTextDocument *document=text->document();//获取textEdit的文本
- QTextFrame* frame=document->rootFrame();//获取根框架
- QTextFrameFormat frameFormat;//创建一个新框架
- frame->setFrameFormat(frameFormat);//使用该框架
常用的框架函数为:
| setBorder() | 设置边距 |
| setBorderBrush() | 设置边距颜色 |
| setBorderStyle() | 设置边距风格 |
| setBorderMargin() | 设置底部边距 |
| setHeight() | 设置高度 |
| setLeftMargin() | 设置左边距 |
| setMargin() | 设置总边距 |
| setPadding() | 设置边框内填充的宽度 |
| setWidth() | 设置宽度 |
| setPosition() | 设置定位帧(设置文本位置) |
| isvalid() | 格式是否有效 |
QTextFrameFormat::BorderStyle(边框风格):
| QTextFrameFormat:::BorderStyle_None | 无样式 |
| QTextFrameFormat:::BorderStyle_Dotted | 点划线 |
| QTextFrameFormat:::BorderStyle_Dashed | 虚线 |
| QTextFrameFormat:::BorderStyle_Solod | 实现 |
| QTextFrameFormat:::BorderStyle_Double | 双线 |
| QTextFrameFormat:::BorderStyle_DotDash | |
| QTextFrameFormat:::BorderStyle_DotDotDash | |
| QTextFrameFormat:::BorderStyle_Groove | 槽状 |
| QTextFrameFormat:::BorderStyle_Ridge | 脊状 |
| QTextFrameFormat:::BorderStyle_Inset | 凹陷 |
| QTextFrameFormat:::BorderStyle_outset | 突出 |
例子:
- QTextEdit *text1=new QTextEdit(this);
- text1->move(100,100);
初始textEdit的形态:

构建自定义框架:
- QTextEdit *text1=new QTextEdit(this);
- text1->move(100,100);
- QTextDocument *docment=text1->document();//获取对象信息
- QTextFrame * rframe=docment->rootFrame();//获取根框架
- QTextFrameFormat format;//创建一个新框架
- format.setBorder(3);//设置边框距离
- format.setPadding(3);//设置内边框距离
- format.setBorderBrush(Qt::black);//设置边框颜色
- format.setMargin(3);//设置外边距
- format.setBorderStyle(QTextFrameFormat::BorderStyle_Solid);//风格为实线
- rframe->setFrameFormat(format);

QTextBlock类为文本文档QTextDocument提供一个文本片段(QTextFragment)的容器一个文本块可以看作为一个段落,但是不能回车换行,回车换行代表创建了新的文本块。
QTextBlock提供只读接口,文本块格式由QTextBlockFormat类处理,主要功能为对齐方式,文本块四周边距、缩进等内容。QTextCharFormat主要处理文本块中的文本内容的格式,字体大小、加粗等。
文档结构:

- 可以直接获得Block
- 也可以先通过Frame,再来访问Block
构造函数:
![]()
常用的函数:
| blockFormatIndex() | 返回当前文本块的索引 |
| begin(),end() | 迭代器 |
| isvalid() | 文本块是否有效 |
| length() | 文本块长度 |
| lineCount() | 返回行数 |
| next() | 下一个文本块 |
| text() | 返回文本块内容 |
1.只遍历主框架的内容
- void Widget::showTextFormat()
- {
- QTextDocument *document=text1->document();//获取对象
- QTextFrame *frame=document->rootFrame();//获取根框架
- QTextFrame::iterator it;//迭代器
- for(it=frame->begin();!(it.atEnd());++it)//遍历
- {
- QTextFrame *childFrame=it.currentFrame();//获取当前框架指针
- QTextBlock childBlock=it.currentBlock();//获取当前文本块
-
- if(childFrame)//如果当前有子框架
- qDebug()<<"frame";
- else if(childBlock.isValid())//文本块是否有效
- qDebug()<<"block:"<<childBlock.text();
- }
- }
2.遍历所有子框架和文本块
- void Widget::showTextBlock()//遍历文本块
- {
- QTextDocument *document=text1->document();
- QTextBlock block=document->firstBlock();//获取第一个文本块
- for(int i=0;i<document->blockCount();i++)
- {
- qDebug()<<tr("文本块%1,文本块首行行号为%2,长度为:%3,内容为:")
- .arg(i).arg(block.firstLineNumber()).arg(block.length())
- <<block.text();
- block=block.next();//下一个文本块
- }
-
- }
构造函数:
![]()
常用的函数:
| alignment() | 对齐方式 |
| margin() | 外边距 |
| isvalid() | 块格式是否有效 |
| setIndent() | 设置缩进 |
| setLineHeight | 设置行高 |
| setTextIndex() | 设置第一行的缩进 |
| setNonBreakableLines() | 设置段落是否可断开 |
文本光标是用于通过模拟文本编辑器中光标行为的编程接口访问和修改文本文档的内容和基础结构的对象。QTextCursor 包含有关光标在QTextDocument中的位置及其所做的任何选择的信息。
构造函数:
| atBlockStart(),atBlockEnd() | 光标是否在文本块开头,结尾 |
| atStart(),atEnd() | 光标是否在文档的开头,结尾 |
| block() | 返回游标所在的块 |
| setBlockCharFromat() | 设置游标所在块的字符格式 |
| currrntFrame() | 返回当前帧的指针 |
| insertBlock() | 光标处插入新的文本块 |
| insertHtml() | 光标处插入Html |
| insertImage() | 光标处插入图像 |
| insertList() | 光标处插入列表 |
| insertTable() | 光标处插入表格 |
| insertText() | 光标处插入内容 |
| isNull() | 光标是否为空 |
| position() | 返回光标的绝对位置 |
| movePosition() | 移动光标的位置 |
| positionInBlock() | 返回游标在块中的位置 |
| select() | 根据给定的选择选择文档中的文本 |
| selectedText() | 返回当前所选的文本(仅文本) |
| selection() | 返回所选择的内容和格式信息 |
| swap() | 交换内容 |
| setWidth(QTextLength::type) | 设置宽度 |
QTextLength ::type
| QTextLength::variableLength | 宽度是可变的 |
| QTextLength::FixedLength | 宽度固定 |
| QTextLength::percentageLength | 宽度以最大宽度的百分比表示 |
例子:
在textEdit中实现左右插入数据
添加两个函数:
- void insertLeftText(QTextDocument *documment,QString text);//左边插入信息
- void insertRightText(QTextDocument *documment,QString text);//右边插入信息
构造函数的内容为:
- resize(800,800);
- QTextEdit *text=new QTextEdit(this);
- text->setFont(QFont("宋体",12));//设置默认字体
- text->setFixedSize(500,500);//设置文本输入框
- text->move(100,100);
- QTextDocument *document=text->document();//获取textEdit的文本
- QTextFrame* frame=document->rootFrame();//获取根框架
- QTextFrameFormat format;
- format.setBorder(2);//设置边距
- format.setMargin(2);//外边距
- format.setPadding(2);//设置内边距
- format.setBorderBrush(Qt::red);//红色边框
- frame->setFrameFormat(format);//设置框架
- insertLeftText(document,"aaaaaaaaaaaaaaaaa");
- insertRightText(document,"bbbbbbbbbbbbbbbbbbb");
两个函数的实现;
- void Widget::insertLeftText(QTextDocument *documment,QString text)//左边插入信息
- {
- QTextFrameFormat format;//创建一个框架格式
- format.setMargin(1);//设置边距
- format.setPadding(5);//设置填充
- format.setBorder(1);//设置边界宽度
- format.setBackground(Qt::red);//设置背景色
- format.setWidth(QTextLength(QTextLength::PercentageLength,50));//以百分比的形式限定
- format.setPosition(QTextFrameFormat::FloatLeft);//放在左边
- QTextCursor cursor=documment->rootFrame()->lastCursorPosition();//获得光标最后位置
- cursor.insertFrame(format);//插入格式
- cursor.insertText(text);//插入内容
- }
- void Widget::insertRightText(QTextDocument *documment,QString text)//右边插入信息
- {
- QTextFrameFormat format;//创建一个框架格式
- format.setMargin(1);//设置边距
- format.setPadding(5);//设置填充
- format.setBorder(1);//设置边界宽度
- format.setBackground(Qt::green);//设置背景色
- format.setWidth(QTextLength(QTextLength::PercentageLength,50));//以百分比的形式限定
- format.setPosition(QTextFrameFormat::FloatRight);//放在左边
- QTextCursor cursor=documment->rootFrame()->lastCursorPosition();//获得光标最后位置
- cursor.insertFrame(format);//插入格式
- cursor.insertText(text);//插入内容
- }
效果:
