QtCreator 富文本使用,QTextEdit,QTextBlock,QTextFrame,QTextTable,QTextList,QTextImage

转发自:https://blog.csdn.net/psujtfc/article/details/37900757     侵删

1. Qt对富文本的处理

1.1 操作方式

编辑操作:使用基于光标的接口函数,模拟用户的编辑操作,且不丢失底层文档框架;文档的光标基于QTextCursor类

只读操作:使用了只读的分层次接口函数,有利于文档的检索和输出;文档的框架基于QTextDocument

1.2 富文本文档的结构

结构元素:框架(QTextFrame),文本块(QTextBlock),表格(QTextTable),列表(QTextList)

对应格式:框架格式(QTextFrameFormat),文本块格式(QTextBlockFormat),表格格式(QTextTableFormat),列表格式(QTextListFrame)

格式是在编辑文档时与QTextCursor配合使用

1.3QTextEdit是一个富文本编辑器,在构建QTextEdit对象时就已经构建了一个QTextDocument对象和一个QTextCursor对象

空文档:包含根框架(rootFrame),文本块(Block)

    QTextDocument *doc = ui->textEdit->document(); //获取文档对象
    QTextFrame *rootFrame = doc->rootFrame();   //获取根框架
    QTextFrameFormat frameFormat;           //创建框架格式
    frameFormat.setBorderBrush(Qt::red);    //设置边界颜色
    frameFormat.setBorder(5);       //设置边界宽度
    rootFrame->setFrameFormat(frameFormat); //给框架使用格式


    QTextFrameFormat frameFormat2;    
    frameFormat2.setBackground(Qt::lightGray);    //设置背景色
    frameFormat2.setMargin(10);        //设置边距
    frameFormat2.setPadding(5);        //设置填充
    frameFormat2.setBorder(2);
    frameFormat2.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);    //设置边框样式
    QTextCursor cursor = ui->textEdit->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();

--------------------- 
作者:psujtfc 
来源:CSDN 
原文:https://blog.csdn.net/psujtfc/article/details/37900757 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(qt)