详细介绍网址:https://www.cnblogs.com/findumars/p/5176228.html
1. Qt对富文本的处理
1.1 操作方式
编辑操作:使用基于光标的接口函数,模拟用户的编辑操作,且不丢失底层文档框架;文档的光标基于QTextCursor类
只读操作:使用了只读的分层次接口函数,有利于文档的检索和输出;文档的框架基于QTextDocument
1.2 富文本文档的结构
结构元素:框架(QTextFrame),文本块(QTextBlock),表格(QTextTable),列表(QTextList)
对应格式:框架格式(QTextFrameFormat),文本块格式(QTextBlockFormat),表格格式(QTextTableFormat),列表格式(QTextListFrame)
格式是在编辑文档时与QTextCursor配合使用
1.3 QTextEdit是一个富文本编辑器,在构建QTextEdit对象时就已经构建了一个QTextDocument对象和一个QTextCursor对象
空文档:包含根框架(rootFrame),文本块(Block)
QTextDocument *textDoc=document();
QTextFrame *textFrame=textDoc->rootFrame();
QTextFrameFormat frameFormat;
frameFormat.setBorderBrush(Qt::red);
frameFormat.setBorder(5);
textFrame->setFrameFormat(frameFormat);
QTextFrameFormat frameFormat2;
frameFormat2.setBackground(Qt::lightGray); //设置背景色
frameFormat2.setMargin(10); //设置边距
frameFormat2.setPadding(5); //设置填充
frameFormat2.setBorder(2);
frameFormat2.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted); //设置边框样式
QTextCursor cursor = textCursor(); //获取光标
cursor.insertFrame(frameFormat2); //在光标处插入框架
1.4 文本块(QTextBlock)
1.4.1遍历文档框架
1.4.1.1 添加槽函数(在主界面头文件中添加)
private slots:
void showTextFrame(); //遍历文档框架
1.4.1.2 在工具栏上添加Action
QAction * act = new QAction(QString("框架"),this);
connect(act,SIGNAL(triggered()),this,SLOT(showTextFrame()));
ui->mainToolBar->addAction(act);
1.4.1.3 添加槽函数的实现代码
void MainWindow::showTextFrame(){
QTextDocument * doc = ui->textEdit->document();
QTextFrame *frame = doc->rootFrame();
QTextFrame::iterator it; //建立QTextFrame类的迭代器
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();
}
}
1.4.2 遍历文本块
1.4.2.1 添加槽函数(在主界面头文件中添加)
void showTextBlock(); //遍历所有文本块
1.4.2.2 在工具栏上添加Action
QAction * act_textBlock = new QAction(QString("文本块"),this);
connect(act_textBlock,SIGNAL(triggered()),this,SLOT(showTextBlock()));
ui->mainToolBar->addAction(act_textBlock);
1.4.2.3 添加槽函数的实现代码
void MainWindow::showTextBlock(){
QTextDocument* doc = ui->textEdit->document();
QTextBlock block = doc->firstBlock(); //获取文档的第一个文本块
for(int i = 0; i < doc->blockCount();i++) {
qDebug() << QString("文本块%1,文本块首行行号为:%2,长度为:%3,内容为:")
.arg(i).arg(block.firstLineNumber()).arg(block.length())
<< block.text();
block = block.next();
}
}
1.4.3 设置字体格式
1.4.3.1 添加槽函数(在主界面头文件中添加)
void setTextFont(bool checked); //设置字体格式
1.4.3.2 在工具栏上添加Action
//设置字体
QAction * act_font = new QAction(QString("字体"),this);
act_font->setCheckable(true);
connect(act_font,SIGNAL(toggled(bool)),this,SLOT(setTextFont(bool)));
ui->mainToolBar->addAction(act_font);
1.4.3.3 添加槽函数的实现代码
void MainWindow::setTextFont(bool checked){
if (checked) {
QTextCursor cursor = ui->textEdit->textCursor();
//插入文本块
QTextBlockFormat blockFormat;
blockFormat.setAlignment(Qt::AlignCenter);
cursor.insertBlock(blockFormat);
//字符格式,字符颜色
QTextCharFormat charFormat;
charFormat.setBackground(Qt::lightGray);
charFormat.setForeground(Qt::blue);
//宋体,12号,加粗,倾斜
charFormat.setFont(QFont(QString("宋体"),12,QFont::Bold,true));
charFormat.setFontUnderline(true);
cursor.setCharFormat(charFormat);
cursor.insertText(QString("测试字体"));
}
}
1.4.4 插入表格,列表,图片
1.4.4.1 添加槽函数(在主界面头文件中添加)
void insertTable(); //插入表格
void insertList(); //插入列表
void insertImage(); //插入图片
1.4.4.2 在工具栏上添加Action
//插入表格
QAction * act_insertTable = new QAction(QString("插入表格"),this);
connect(act_insertTable,SIGNAL(triggered()),this,SLOT(insertTable()));
ui->mainToolBar->addAction(act_insertTable);
//插入列表
QAction * act_insertList = new QAction(QString("插入列表"),this);
connect(act_insertList,SIGNAL(triggered()),this,SLOT(insertList()));
ui->mainToolBar->addAction(act_insertList);
//插入图片
QAction * act_insertImage = new QAction(QString("插入图片"),this);
connect(act_insertImage,SIGNAL(triggered()),this,SLOT(insertImage()));
ui->mainToolBar->addAction(act_insertImage);
1.4.4.3 添加槽函数的实现代码
void MainWindow::insertTable(){
QTextCursor cursor = ui->textEdit->textCursor();
QTextTableFormat tableFormat;
tableFormat.setCellPadding(10);
tableFormat.setCellSpacing(2);
cursor.insertTable(2,2,tableFormat);
}
void MainWindow::insertList(){
QTextCursor cursor = ui->textEdit->textCursor();
QTextListFormat listFormat;
listFormat.setStyle(QTextListFormat::ListDecimal);
cursor.insertList(listFormat);
}
void MainWindow::insertImage(){
QTextImageFormat imageFormat;
imageFormat.setName(":/image/2.jpg");
ui->textEdit->textCursor().insertImage(imageFormat);
}
1.4.5 查找
1.4.5.1 前置声明QLineEdit,在界面头文件中前置声明
class QLineEdit;
1.4.5.2 添加私有对象,前置声明就是为了这里使用的
QLineEdit *lineEdit;
1.4.5.3 添加私有槽函数
void textFind(); //文本查找
void findNext(); //查找下一个
1.4.5.4 添加action
//查找
QAction *act_find = new QAction(QString("查找"),this);
connect(act_find,SIGNAL(triggered()),this,SLOT(textFind()));
ui->mainToolBar->addAction(act_find);
1.4.5.5 实现槽函数
void MainWindow::textFind() //查找文本{
QDialog *dlg = new QDialog(this); //创建查找对话框
lineEdit = new QLineEdit(dlg); //创建字符串输入框
QPushButton* btFindNext = new QPushButton(this); //查找按钮
btFindNext->setText(QString("查找下一个"));
connect(btFindNext,SIGNAL(clicked()),this,SLOT(findNext())); //关联查找信号和槽
QVBoxLayout* layout = new QVBoxLayout; //垂直布局
layout->addWidget(lineEdit); //将控件添加到主界面
layout->addWidget(btFindNext);
dlg->setLayout(layout);
dlg->show();
}
void MainWindow::findNext(){
QString string = lineEdit->text();
//查找字符串,查找标志:QTextDocument::FindBackward:向前查找,
//FindWholeWords:整个文档查找,FindCaseSensitively:忽略大小写查找
bool isFind = ui->textEdit->find(string,QTextDocument::FindWholeWords);
if (isFind) {
qDebug() << QString("行号:%1,列号:%2").arg(ui->textEdit->textCursor().blockNumber())
.arg(ui->textEdit->textCursor().columnNumber());
}
}
1.4.6语法高亮与html
1.4.6.1添加新的文件,选择C++ 类,类名:mySyntaxHighlighter,基类:QSyntaxHighlighter,继承自:QObject
1.4.6.2 修改mysyntaxhighlighter.h头文件
将QTextDocument类对象指针作为其父部件指针,这样可以自动调用highlightBlock()函数,可以时的检测文本
//将QTextDocument作为父窗口这样就可以自动调用highlightBlock()函数
explicit mySyntaxHighlighter(QTextDocument *parent = 0);
重新实现highlightBlock()函数以便将,字符串的格式应用到特定的字符串上面
protected :
void highlightBlock(const QString &text); //必须重新实现该函数
1.4.6.3 修改mysyntaxhighlighter.cpp文件
mySyntaxHighlighter::mySyntaxHighlighter(QTextDocument *parent) :
QSyntaxHighlighter(parent){
}
void mySyntaxHighlighter::highlightBlock(const QString &text){
QTextCharFormat charFormat; //设置匹配的字符格式
charFormat.setFontWeight(QFont::Bold);
charFormat.setForeground(Qt::green);
QString pattern = "\\bchar\\b"; //要匹配的字符,这里是char单词
QRegExp expression(pattern); //创建正则表达式
int index = text.indexOf(expression); //默认从0开始匹配字符串
//如果匹配成功,返回值为字符串的起始位置,它大于或等于0
while(index >= 0 ) {
int length = expression.matchedLength(); //要匹配字符串的长度
setFormat(index,length,charFormat); //对要匹配的字符串设置格式
index = text.indexOf(expression,index + length); //继续匹配
}
}
1.4.6.4 修该主界面头文件
class mySyntaxHighlighter;
添加私有变量
mySyntaxHighlighter *highlighter;
1.4.6.5 修该主界面的cpp文件
在构造函数中添加
highlighter = new mySyntaxHighlighter(ui->textEdit->document());
1.4.7 QTextEdit的使用
1.4.7.1 建立一个QTextEdit
QTextDocument *m_doc = new QTextDocument("文本框中的文本");//创建一个装文本的容器
QTextEdit te;//定义文本框
te.setDocument(m_doc);//为文本框绑定内容
1.4.7.2 向QTextEdit中写入数据
QString gyyq = rec.value("gy").toString();
te.document()->setPlainText(gyyq);
1.4.7.3 从QTextEdit中读取数据
QString gyyq = te.document()->toPlainText();