第一次比较深入地使用QTextEdit,发现里面的内容十分丰富,官方文档释义:
The QTextEdit class provides a widget that is used to edit and display both plain and rich text(用于编辑和显示纯文本和富文本)
所以能做很多的事情,现在把我的使用收获记录下来,才疏学浅,多多指教,话不多说,直接进入主题
- 所属头文件
#include <QTextEdit>
- 初始化
// 指定parent:能让parent自动回收内存,否则需要自己手动释放 ----防止内存泄漏
QTextEdit *text_edit = new QTextEdit(parent);
- 添加文字
QString add_text = u8"添加文字";
// 第一种方式: append(const QString &text) --最普通的添加方式,在文本内容后面添加新的文本内容
text_edit->append(add_text);
// 第二种方式:insertText(const QString &text) --比较灵活的添加方式,可以在textEdit框内任何位置添加文本
// 获取当前textEdit文本块中光标位置,可以随意调动位置,在调动的位置添加文本 --QTextCursor的使用详解在后面的文章介绍
QTextCursor cursor = text_edit->textCursor();
// 设置添加的文字的样式 --注意:设置文字样式后,后面添加的文字,如果没有选择样式,默认使用现在添加的字体样式
// 添加的文字:字体颜色:红色;字体:"微软雅黑";字体大小:16px
QTextCharFormat char_format;
char_format.setForeground(Qt::red);
char_format.setFontFamily(u8"微软雅黑");
char_format.setFontPointSize(16);
cursor.insertText(add_text, char_format);
// 移动光标在起始位置,在起始位置添加文本信息
cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor);
cursor.insertText(add_text);
// 移动光标在结束位置,在结束位置添加文本信息
cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor);
cursor.insertText(add_text);
// 移动光标在任意位置(距离左边第四个文本块位置),添加文本信息
cursor.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, 4);
cursor.insertText(add_text);
// ......其他依次类推
// 第三种方式:insertHtml(const QString &html) --能添加h5格式的文本内容
// 显示字体大小为12px、颜色为红色
add_text = u8"<font size=\"12px\" color=\"red\">添加文字</font>"
cursor.insertHtml(add_text);
// 显示为 谷歌翻译 的链接 --注意:链接的打开,需要自己写相应的响应函数
add_text = u8"<a href = \"https://translate.google.cn\"></a>"
cursor.insertHtml(add_text);
- 添加图片
QString add_img_path = u8"d:\\蜘蛛侠_平行世界.png";
// 第一种方式: insertImage(const QString &name)
// 直接通过文件路径加载图片
cursor.insertImage(add_img_path);
// 第二种方式: insertImage(const QImage &image, const QString &name = QString())
// 如果有已经存在的image对象,可以直接加载image对象,不依赖于路径
QImage add_img(add_img_path);
cursor.insertImage(add_img, add_img_path); //后面add_img_path可以不传
// 第三种方式: insertImage(const QTextImageFormat &format)
// 能对添加的图片做一些属性的处理,比如高度、宽度......
text_edit->document()->addResource(QTextDocument::ImageResource, QUrl(":/Images/qq"), QVariant(image));
QTextImageFormat img_format;
img_format.setName(add_img_path);
img_format.setWidth(100);
img_format.setHeight(100);
cursor.insertImage(img_format);
// 第四种方式:insertHtml(const QString &html)
// 用h5的文本格式加载图片 可以使用h5文本来设置图片的各个属性
QString add_text = QString("<img src=\"%1\" width=\"100\" height=\"100\">").arg(add_img_path);
ui->textEdit->textCursor().insertHtml(add_text);
- 插入动态图(gif图片)
QString add_img_path = u8"d:\\蜘蛛侠_平行世界.gif";
// 先以图片的方式,载入图片
text_edit->document()->addResource(QTextDocument::ImageResource, QUrl(add_img_path), QVariant(image));
QTextImageFormat img_format;
img_format.setName(add_img_path);
img_format.setWidth(100);
img_format.setHeight(100);
cursor.insertImage(img_format);
// 用QMovie类对gif图片进行循环播放
QMoive* movie = new QMoive(this);
movie->setFileName(add_img_path );
// 关联movie跑起来帧数变化,来显示每一帧图片
connect(movie, &QMovie::frameChanged, this, [this, url](int num){
//使用QMovie中的当前帧替换掉富文本中的图片元素
QMovie* movie = qobject_cast<QMovie*>(sender());
this->text_edit->document()->addResource(QTextDocument::ImageResource, url, movie->currentImage());
this->text_edit->setLineWrapColumnOrWidth(lineWrapColumnOrWidth());
});
// 开始让动画跑起来
movie->start();
- 获取QTextEdit中的内容
// 获取文本内容
QString info = text_edit->toPlainText();
// 如果有很复杂的富文本,遍历富文本内容,解析出自己的数据
QTextDocument* doc = text_edit->document();
// 获取每一个段落
QTextBlock cur_block = doc->begin();
while (cur_block.isValid())
{
// 获取每一个分段
for (QTextBlock::iterator iter = cur_block.begin(); iter != cur_block.end(); iter++)
{
QTextFragment cur_fragment = iter.fragment();
QTextFormat format = cur_fragment.charFormat();
if (format.isImageFormat())
{
// 图片信息
QTextImageFormat img_format = format.toImageFormat();
// 图片的本地路径
QString img_path = img_format.stringProperty(QTextFormat::ImageName)
}
else if (format.isCharFormat())
{
// 文本内容
QString info = cur_fragment.text();
}
......
}
cur_block = cur_block.next();
}
QTextEdit还是比较复杂的一个控件,使用的越多,就会发现它有嘿强大的功能以及嘿多的坑…