前言
文本片段用于单一字符格式字符的存储。字符格式为字符提供不同的样式。
富文本文档的文档元素:QTextFragment类和QTextCharFormat 类的层次结构如下图所示:
QTextCharFormat类
QTextCharFormat类提供了QTextDocument中字符的格式化信息。
主要就是为了设置字符的字体、大小、前景、背景、下划线、超链接等比较常见的功能。相同的字符格式组成同一个文本片段。文档中文本的字符格式指定文本的可视属性,以及关于其在超文本文档中的角色的信息。
可以通过向setFont()函数提供字体来设置所使用的字体,并且可以调整其外观的各个方面以获得所需的效果。setFontFamily()和setFontPointSize()定义字体的族(例如时间)和打印大小;setFontWeight()和setFontItalic()提供对字体样式的控制。
setFontUnderline()、setFontOverline()、setFontStrikeOut()和setFontFixedPitch()为文本提供额外的效果。
颜色是用setForeground()设置的,背景用setBackground()设置
如果文本打算用作锚(用于超链接),可以使用setAnchor()来启用它。setAnchorHref()和setAnchorNames()函数用于指定有关超链接的目的地和锚的名称的信息。
QTextFragment类
QTextFragment类使用一个QTextCharFormat在QTextDocument中保存一段文本。
文本片段描述用单一字符格式存储的一段文本。字符格式更改后可以由具有不同格式的文本片段序列表示的文本。
如果用户在片段中编辑文本并引入不同的字符格式,那么片段的文本将在格式改变的每个点上被分割,并且新的片段将被创建。例如,在句子中间改变某些文本的风格会导致片段被分成三个独立的片段:第一个和第三个片段采用与之前相同的格式,第二个采用新的风格。第一个片段将包含从句子开头开始的文本,第二个片段将包含从中间开始的文本,第三个片段将从句子结尾开始的文本。
文本片段的文本和字符格式可以通过text()和charFormat()函数获得。
length()函数的作用是:给出片段中文本的长度。
position()给出了片段在文档中开始的位置。
要确定片段是否包含文档中的特定位置,可以使用contains()函数。
代码示例
主要代码如下:
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
edit = new QTextEdit;
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(edit);
resize(600,400);
QTextDocument *doc = edit->document(); //获取文本文档
QFont font("楷体",12);
doc->setDefaultFont(font); //设置文本文档的默认字体
//通过文本编辑器获取当前文本光标
QTextCursor cursor = edit->textCursor();
//定义文本字符格式 charFormat变量
QTextCharFormat charFormat;
//设置charFormat的字体
charFormat.setFont(QFont("宋体",12));
//设置charFormat的字体颜色,即前景色- 暗青
charFormat.setForeground(Qt::darkCyan);
//当前文本光标设置字符格式
cursor.setCharFormat(charFormat);
cursor.insertText("The character format of text in a document specifies the visual properties of the text, as well as information about its role in a hypertext document.");
//换一种字体颜色 红色
charFormat.setForeground(Qt::red);
cursor.setCharFormat(charFormat);
cursor.insertText("The QTextBlock class provides a container for text fragments in a QTextDocument.");
//字符格式的超链接的使用
charFormat.setAnchor(true); //启用锚功能
charFormat.setAnchorHref("http://www.baidu.com"); //超链接地址
charFormat.setBackground(Qt::blue); //字体背景
charFormat.setFontUnderline(true); //设置下划线
cursor.setCharFormat(charFormat);
cursor.insertText("hello,百度");
// qDebug() << cursor.charFormat().isAnchor();
// if(cursor.charFormat().isAnchor())
// QDesktopServices::openUrl(cursor.charFormat().anchorHref()); //通过桌面服务打开超链接
//文本片段的迭代,通过所在的容器的迭代器
QTextBlock::iterator it;
for (it = cursor.block().begin(); !(it.atEnd()); ++it) {
QTextFragment currentFragment = it.fragment();
if (currentFragment.isValid()) {
if(currentFragment.charFormat().isAnchor())
qDebug() <<currentFragment.text() << currentFragment.charFormat().anchorHref();
else
qDebug() <<currentFragment.text() ;
}
}
}
总结
文本片段和文本字符格式是配合使用的,但是文本片段的创建是由不同的文本字符格式自动创建的,没有人工的参与。