版权声明:若无来源注明,

Techie亮博客文章均为原创。 转载请以连接形式标明本文标题和地址:

本文标题:Qt富文本编辑器QTextDocument     本文地址:

https://www.techieliang.com/2017/12/726/

1. 介绍

对于文本编辑,qt提供了不少控件html

QLineEdit:单行文本输入,好比用户名密码等简单的较短的或者具备单一特征的字符串内容输入。使用text、settext读写

QTextEdit:富文本编辑器,支持html显示,能够用sethtml/tohtml进行html文本操做或使用,也可利用setPlainText、toPlainText进行纯文本操做

QPlainTextEdit:纯文本编辑器,使用了近似于textedit的技术并作了纯文本编辑的优化,并具备文章段落的概念也提供了撤销等功能,但不支持html显示。

QTextBrowser:继承于QTextEdit,仅提供显示功能,并提供了超文本导航功能,若是不须要超文本链接只须要使用QTextEdit并设置QTextEdit::setReadOnly

上述都是显示控件,能够肯定的是富文本编辑器要用QTextEdit或者QPlainTextEdit,可是确定不能主动撰写html代码或者逐个处理显示格式实现富文本,实际上Qt提供了相关类:QTextDocument富文本文档、QTextBlock文本快、QTextFrame框架、QTextTable表格、QTextList列表、QTextCursor指针位置、QTextXXXXFormat各类数据类型样式。对于富文本的全部帮助请见官方文档:Rich Text Processingwindows

QTextEdit和QPlainTextEdit选择:差别是QTextEdit提供了tohtml,若是想在处理完文档,直接根据文档生成html做为博客等内容,可使用此类,没有须要后者便可api

注意关系:QTextDocument>QTextFrame>QTextBlock/QTextTable/QTextList前包含后app

查看两个类的api,均提供了document方法,能够返回QTextDocument指针,用于经过QTextDocument的方式操做文档内容格式,官方范例:框架

Calendar Example利用富文本编辑器的方式实现日历(不建议学这个毕竟已经有现成的日历控件,并且文档中每每也不会插入日历)post

Order Form Example根据一些的参数设置生成报表,其实和上面的原理同样优化

2. 基本使用

首先当具备一个edit时,不须要自行建立document,能够直接用document方法能够获取当前edit的document

QTextDocument只是一个文档,其内还有根节点,须要使用QTextDocument::rootFlrame获取,设置根节点的边框粗细、颜色就相似于设置word文档边框底纹

2.1. 简单范例

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

#include

#include

MainWindow::MainWindow(QWidget *parent):

QMainWindow(parent),

ui(newUi::MainWindow){

ui->setupUi(this);

QTextDocument* doc = ui->textEdit->document();

QTextFrame *root_frame = doc->rootFrame();

QTextFrameFormat root_frame_format = root_frame->frameFormat();//建立框架格式

root_frame_format.setBorderBrush(Qt::darkBlue);//设置边界颜色

root_frame_format.setBorder(5);//设置边界宽度

root_frame->setFrameFormat(root_frame_format);//给框架使用格式

QTextFrameFormat frame_format;

frame_format.setBackground(Qt::darkRed);//设置背景色

frame_format.setMargin(10);//设置边距

frame_format.setPadding(5);//设置填充

frame_format.setBorder(2);//设置边界宽度

frame_format.setBorderStyle(

QTextFrameFormat::BorderStyle_Solid);//设置边框样式

frame_format.setPosition(QTextFrameFormat::FloatRight);//右侧

frame_format.setWidth(QTextLength(

QTextLength::PercentageLength, 40));//宽度设置

QTextCursor cursor = ui->textEdit->textCursor();

cursor.insertText("A company");

cursor.insertBlock();

cursor.insertText("321 City Street");

cursor.insertBlock();

cursor.insertFrame(frame_format);

cursor.insertText("Industry Park");

cursor.insertBlock();

cursor.insertText("Another country");

}

上述代码仅显示了四行文字,前两行在root跟框架显示,后两行在一个新建的frame中显示,并将frame置于右侧限定了宽度,更多的布局方法请参考:Order Form Example

上述并未对文本格式作设置,能够在insertText的第二个参数直接赋予一个文本格式QTextCharFormat

2.2. QTextCursor光标操做/遍历嵌套Frame/遍历全部Block

首先他有各类instert函数能够插入上面提到的各类文档中的数据类型。有时并不能一次准确的创建好整个文档,须要在中间插入,这样就须要setPosition命令,而positon的具体值能够经过上述各类数据类型的类获取到每一个块或者框架或者其余类型开头的positon,也能够经过length获取到当前块的长度用于定位末尾位置。下面提供一个简单范例

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

#include

#include

#include

MainWindow::MainWindow(QWidget *parent):

QMainWindow(parent),

ui(newUi::MainWindow){

ui->setupUi(this);

QTextDocument* doc = ui->textEdit->document();

QTextFrame *root_frame = doc->rootFrame();

QTextFrameFormat root_frame_format = root_frame->frameFormat();//建立框架格式

root_frame_format.setBorderBrush(Qt::darkBlue);//设置边界颜色

root_frame_format.setBorder(5);//设置边界宽度

root_frame->setFrameFormat(root_frame_format);//给框架使用格式

QTextFrameFormat frame_format;

frame_format.setBackground(Qt::darkRed);//设置背景色

frame_format.setMargin(10);//设置边距

frame_format.setPadding(5);//设置填充

frame_format.setBorder(2);//设置边界宽度

frame_format.setBorderStyle(

QTextFrameFormat::BorderStyle_Solid);//设置边框样式

frame_format.setPosition(QTextFrameFormat::FloatRight);//右侧

frame_format.setWidth(QTextLength(

QTextLength::PercentageLength, 40));//宽度设置

QTextCursor cursor = ui->textEdit->textCursor();

cursor.insertText("A company");

cursor.insertBlock();

cursor.insertText("321 City Street");

cursor.insertFrame(frame_format);

cursor.insertText("Industry Park");

cursor.insertBlock();

cursor.insertText("Another country");

//遍历frame

for(autoblock = root_frame->begin();!block.atEnd();++block){

if(block.currentBlock().isValid()){

qDebug()<

}

elseif(block.currentFrame()){//frame嵌套,范例只有两层因此不递归了

autochild_frame = block.currentFrame();

for(autoblock2 = child_frame->begin();!block2.atEnd();++block2){

if(block.currentBlock().isValid()){

qDebug()<

}

}

}

}

//还能够经过root_frame->childFrames()直接获取所字frame

//遍历文本块

QTextBlock block = doc->firstBlock();

for(inti = 0; i < doc->blockCount();i++){

qDebug()<< QString("block num:%1\tblock first line number:%2\tblock length:%3\ttext:")

.arg(i).arg(block.firstLineNumber()).arg(block.length())

<< block.text();

block = block.next();

}

QTextBlock insert_block = doc->firstBlock().next();

//在第二行末尾添加

cursor.setPosition(insert_block.position()+insert_block.length()-1);

cursor.insertText("change cursor postion and insert");

//在第三行开头添加-也就是新frame里面最开始添加

//方法一,第二行末尾+1就是第三行开头

cursor.setPosition(insert_block.position()+insert_block.length());

//方法二,position默认返回的就是一个块开头

cursor.setPosition(insert_block.next().position());

//方法三,利用frame,frame是在一个锚点定位,开头在第二行末尾因此必须加一

cursor.setPosition(frame_format.position()+1);

cursor.insertText("change cursor postion and insert");

}

前面的内容没有变化,后面先展现了如何遍历全部frame以及嵌套的frame。若是是全文检索或者总体修改也能够直接遍历全文全部block

qt 富文本 html,Qt富文本编辑器QTextDocument相关推荐

  1. Qt富文本编辑器QTextDocument

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt富文本编辑器QTextDocument     本文地址:https://www.tech ...

  2. QT专业技能实训-富文本编辑器

    目录 1 概述 1.1 专业技能实训目的与要求 1.2 项目背景 1.2.1 项目知识背景 1.2.2 项目设计背景 2 需求分析 2.1软件需求 2.1.1设计需求 2.1.2功能需求 2.2用户需 ...

  3. Qt开发技术:Qt富文本(三)Qt支持的HTML子集(查询手册)以及涉及的类

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  4. Qt开发技术:Qt富文本(一)富文本介绍、文档结构

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  5. PyQt(Python+Qt)学习随笔:纯文本编辑器QPlainTextEdit功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QPlainTextEdit是用于纯文本的一个高级文档编辑器 ...

  6. h5 富文本输入框_H5富文本编辑器的详细介绍

    使用H5的全局属性contenteditable可以让DOM元素及其子元素变的可编辑 样式代码 html, body { overflow: hidden; width: 100%; height: ...

  7. 富文本之文本边框格式、文本块

    一.边框格式  向创建的mainWIndows.h添加槽函数: private slots:void showTextFrame();//遍历文本框架 showTextFrame()函数实现: voi ...

  8. 【Qt】Qt 开发桌面程序 ( Qt 版本 5.14.2 | 编辑 Qt 桌面按钮控件 | 修改按钮文本 | 为按钮添加点击事件 | 系统调用 | 去掉系统调用命令窗口 )

    文章目录 一.添加按钮控件 二.修改按钮文本 三.为按钮添加点击事件 ( 弹出对话框 ) 四.为按钮添加点击事件 ( 打开记事本 ) 五.为按钮添加点击事件 ( 打开计算器 ) 六.去掉系统调用时弹出 ...

  9. 从html富文本中提取纯文本

    其实从html富文本中提取纯文本很简单,富文本基本上是使用html标签给文本加上丰富多彩的样式. 所以只需要将富文本字符串中的"<.....>"标签剔除,即可得到纯文本 ...

  10. PMEdit一个富文本框可以编辑文本、图片并可以显示GIF动画

    一.在开始之前首先吐槽一下,本人是一个独立开发者,在中国独立开发者就代表一个比较苦逼的行业,特别是对底层东西进行开发者,尤其本人研究方向是编译器.解析器基本上没有公司要,所以出来做个独立开发者.作为独 ...

最新文章

  1. 城市大脑不仅是AI系统,更是结合人类智慧的混合智能巨系统
  2. restful-api接口的设计规范介绍
  3. Android-Frame布局,UI布局切换,录音,照相机,影音播放器,音频播放器
  4. linux集群命令关闭其中一台,自己整理的一点Linux命令集
  5. 学计算机的管理医生,计算机科学与技术系医学生管理工作体会.pdf
  6. HDU 2574 HDOJ 2574 Hdu Girls' Day ACM 2574 IN HDU
  7. Liferay –简单主题开发
  8. 【规范化标准】之 ESLint、Stylelint
  9. 光流估计算法RAFT的论文和代码阅读
  10. 移动互联网和Android给你带来的机会[轉]
  11. oracle修改filesystem,oracle数据库 boost::filesystem使用例子
  12. 终于解决了贴吧手机版的一个重大BUG
  13. 基于node.js的express使用mysql语句在插入数据时防重插入
  14. destoon php版本,Destoon 7.0最新版常见问题解决方法
  15. 神书《纳瓦尔宝典:财富和幸福指南》说了些什么
  16. python代码示例大全 下载-python基础代码大全
  17. 有道云笔记免费使用视图中背景纸张
  18. antd 表格分页功能
  19. 知名互联网大厂——推荐算法工程师、专家、leader
  20. 【曾贤志】Power Map For Excel地图图表视频教程-曾贤志-专题视频课程

热门文章

  1. 解决iOS 15上图标出现对号的问题
  2. 怎样挖掘搜索关键词?
  3. 林海峰讲的python_线性回归模型与最小二乘法(附python源码)
  4. 《数据结构》第五章 树和二叉树 同学问题收集站
  5. 教你巧用万用表测量大值电阻
  6. Chrome断点JS寻找淘宝签名sign
  7. “知乎精英”怎么就成了骂人的词
  8. python计算贷款购房月供、利息
  9. 安卓 运行 linux 桌面,桌面系统来到手机 Ubuntu手机系统解析
  10. 编程艺术——软件设计模式SOLID原则