Qt富文本处理

转自:http://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();










版权声明:本文为博主原创文章,未经博主允许不得转载。

转自:http://blog.csdn.net/psujtfc/article/details/37900757

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值