【QT】QT富文本

富文本

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

PlainText为纯文本。

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

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

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

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

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

【QT】QT富文本

文档边框格式

示例:

【QT】QT富文本

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

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

【QT】QT富文本

	//添加工具栏行选项

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

语法高亮

【QT】QT富文本

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

字符查找

【QT】QT富文本

```
    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());
    }
}
上一篇:AJAX xmlhttprequest vs fetch


下一篇:DOM操作汇总