【QT】QT富文本

简介: 【QT】QT富文本

富文本

QTextEdit支持富文本处理,即文档中可使用多种格式,如文字、图片、表格等。

PlainText为纯文本。

由此可类比, windows的记事本就是纯文本编辑器,word就是富文本编辑器。

文档的光标主要基于QTextCursor类,文档的框架主要基于QTextDocument类。

一个富文本的文档结构主要分为几种元素:框架(QTextFrameFormat)、文本块(QTextBlock)、表格(QTextTable)、列表(QTxtList)。

每种元素的格式有相应的format类表示:框架格式(QTextDFrameFormat)、文本块格式(QTextBlockFormat)、表格格式(QText)、列表格式(QTextListFormat)。这些格式通常配合QTextCursor类使用。

QTextEdit类就是一个富文本编辑器,在构建QTextEdit类对象时就已经构建了一个QTextDocument类对象和一个QTextCursor类对象。只需调用他们相应的操作即可。

image-20220129211052245

文档边框格式

示例:

image-20220129211226050

   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);

文本个格式、文本块格式、字符格式

image-20220130182600946

    //添加工具栏行选项

    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);
}

语法高亮

image-20220202233158144

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);
   }
}

字符查找

image-20220203120216663

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());
    }
}
相关文章
|
存储 前端开发 Cloud Native
C++Qt QSS要注意的坑
C++Qt QSS要注意的坑
23 QT - 自定义控件
23 QT - 自定义控件
56 0
|
3月前
|
前端开发 程序员 API
【Qt】控件介绍
【Qt】控件介绍
|
6月前
|
开发框架 数据可视化 前端开发
【Qt 学习笔记】Qt控件概述
【Qt 学习笔记】Qt控件概述
91 0
QT TextEdit控件 全面详解
本文详细的介绍了TextEdit控件的各种操作,例如:获取内容、输入控件字符、保持在最后一行添加(自动滚屏)、定时关闭、添加数据换行、向鼠标位置插入一行字符、设置字体颜色属性等操作。 本系列QT全面详解文章目前共有十五篇,本系列文章较为详细的讲述了QT控件的基础操作和使用,也谢谢大家的关注、点赞、收藏。
1531 2
QT TextEdit控件 全面详解
|
6月前
Qt6学习笔记八(其他控件)
Qt6学习笔记八(其他控件)
59 0
PyQt5-QLabel控件是什么?方法有哪些?具体如何使用?
PyQt5-QLabel控件是什么?方法有哪些?具体如何使用?
70 0
|
JavaScript
Qt图片浏览器
可以显示jpg、jpeg、png、bmp。可以从电脑上拖动图到窗口并显示出来或者打开文件选择 重载实现dragEnterEvent(拖拽)、dropEvent(拖拽放下)、resizeEvent(窗口大小改变)
109 0
Qt之QSS(QTreeView)
简述 QTreeView 作为一个树形控件,我们经常用到,只要对样式熟悉,可以做出特别漂亮的特效。 简述 自定义 QTreeView 指示器 整行拓展 自定义 QTreeView 交替行的背景色可以使用下面样式代码来定义: QTreeView { alternate-background-color: yellow; } 当鼠标划过
3921 0
|
Web App开发 索引
Qt之QTableView显示富文本
简述 对于QTableView中的显示,我们前面介绍过很多种,其中包括:文本、进度条、复选框等,今天我们介绍一下关于富文本的显示。 可能绝大多数小伙伴会通过QAbstractTableModel中的data来实现,可是现实告诉我们,那是行不通的,那么我们如何去显示呢?请看正文。 简述 效果 源码 分析 效果 源码 下面我们使用QAbstrac
1042 0