富文本
QTextEdit支持富文本处理,即文档中可使用多种格式,如文字、图片、表格等。
PlainText为纯文本。
由此可类比, windows的记事本就是纯文本编辑器,word就是富文本编辑器。
文档的光标主要基于QTextCursor类,文档的框架主要基于QTextDocument类。
一个富文本的文档结构主要分为几种元素:框架(QTextFrameFormat)、文本块(QTextBlock)、表格(QTextTable)、列表(QTxtList)。
每种元素的格式有相应的format类表示:框架格式(QTextDFrameFormat)、文本块格式(QTextBlockFormat)、表格格式(QText)、列表格式(QTextListFormat)。这些格式通常配合QTextCursor类使用。
QTextEdit类就是一个富文本编辑器,在构建QTextEdit类对象时就已经构建了一个QTextDocument类对象和一个QTextCursor类对象。只需调用他们相应的操作即可。
文档边框格式
示例:
ui->setupUi(this);
//获取文档对象
QTextDocument* document = ui->textEdit->document();
//获取根 框架
QTextFrame *rootFrame = document->rootFrame();
//文档格式框架
QTextFrameFormat format;
format.setBorderBrush(Qt::red);//边框颜色
format.setBorder(3);//边界宽度
//设置文档框架格式
rootFrame->setFrameFormat(format);
//设置文本边框风格
QTextFrameFormat frameFormat;
frameFormat.setBackground(Qt::lightGray);
frameFormat.setMargin(10);//设置边距
frameFormat.setPadding(5);//设置填衬
frameFormat.setBorder(2);
frameFormat.setBorderStyle(QTextFrameFormat::BorderStyle_DotDash );
QTextCursor cursor = ui->textEdit->textCursor();
cursor.insertFrame(frameFormat);
文本个格式、文本块格式、字符格式
//添加工具栏行选项
QAction* action_textFrame = new QAction("框架",this);
connect(action_textFrame,&QAction::triggered,this,&MainWindow::showTextFrame);
ui->mainToolBar->addAction(action_textFrame);
QAction* action_textBlock = new QAction("文本块",this);
connect(action_textBlock,&QAction::triggered,this,&MainWindow::showTextBlock);
ui->mainToolBar->addAction(action_textBlock);//添加到工具栏中
QAction* action_textFont = new QAction("字体",this);
action_textFont->setCheckable(true);
connect(action_textFont,&QAction::triggered,this,&MainWindow::setTextFont);
ui->mainToolBar->addAction(action_textFont);
void MainWindow::showTextFrame()
{
QTextDocument* document = ui->textEdit->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();
}
}
}
void MainWindow::showTextBlock()
{
QTextDocument* document = ui->textEdit->document();
QTextBlock block = document->firstBlock();
//document->blockCount()返回文本块个数
for(int i =0 ; i < document->blockCount();i++)
{
qDebug()<<QString("文本块%1,文本块首行行号为:%2,长度:%3,内容%4").arg(i).arg(block.firstLineNumber()).arg(block.length()).arg(block.text());
block = block.next();
}
}
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);
//字体
charFormat.setFont(QFont(QString("宋体"),12,QFont::Bold,true));
//下划线
charFormat.setFontUnderline(true);
//设置字符格式
cursor.setCharFormat(charFormat);
cursor.insertText("嘻嘻");
}
}
文档插入表格、列表、图片
void MainWindow::insertTable()
{
QTextCursor cursor = ui->textEdit->textCursor();
QTextTableFormat format;//表格格式
format.setCellSpacing(2);//表格外边空白
format.setCellPadding(10);//表格内边空白
cursor.insertTable(3, 3,format);
}
void MainWindow::insertList()
{
QTextListFormat format;//列表格式
format.setStyle(QTextListFormat::ListDecimal);//数字编号
ui->textEdit->textCursor().insertList(format);
}
void MainWindow::insertImage()
{
QString filePath = QFileDialog::getOpenFileName(this,"选择图片",".","JPEG(*.jpg *.jpeg);;""GIF(*.gif);;""PNG(*.png)");
QUrl url(QString("file://%1").arg(filePath));
QImage image = QImageReader(filePath).read();
QTextDocument* document = ui->textEdit->document();
//文档添加图片资源
document->addResource(QTextDocument::ImageResource,url,QVariant(image));
QTextCursor cursor =ui->textEdit->textCursor();
QTextImageFormat imgFormat;
imgFormat.setWidth(image.width());
imgFormat.setHeight(image.height());
imgFormat.setName(url.toString());
cursor.insertImage(imgFormat);
}
语法高亮
void MySyntaxHighlighter::highlightBlock(const QString &text)
{
QTextCharFormat format;//字符格式
format.setFontWeight(QFont::Bold);
format.setBackground(Qt::red);
format.setForeground(Qt::green) ;
QString pattern = "\\bgood\\b";//匹配单词边界
QRegExp expression(pattern);
int index = text.indexOf(expression);
while(index >= 0 )
{
int length = expression.matchedLength();//匹配到的字符长度
setFormat(index,length,format);
index = text.indexOf(expression,index + length);
}
}
字符查找
QAction* action_textFind = new QAction("查找",this);
connect(action_textFind,&QAction::triggered,this,&MainWindow::textFind);
ui->mainToolBar->addAction(action_textFind);
m_findDialg = new QDialog(this);//查找对话框
m_lineEdit = new QLineEdit(m_findDialg);//查找输入框
QPushButton* btn = new QPushButton(m_findDialg);
btn->setText("查找下一个");
connect(btn,&QPushButton::clicked,this,&MainWindow::textNext);
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(m_lineEdit);
layout->addWidget(btn);
m_findDialg->setLayout(layout);
void MainWindow::textFind()
{
m_findDialg->show();
}
void MainWindow::textNext()
{
QString strFind = m_lineEdit->text();
bool isFind = ui->textEdit->find(strFind,QTextDocument::FindBackward);
if(isFind)
{
qDebug()<<QString("行号:%1,列号:%2")
.arg(ui->textEdit->textCursor().blockNumber())
.arg(ui->textEdit->textCursor().columnNumber());
}
}