QTextEdit 控件的妙用(以及与QPlainTextEdit的区别)

来源:互联网 发布:德州用友软件 编辑:程序博客网 时间:2024/06/03 17:00

1.QTextEdit 可以将 纯文本plainText 转化为 富文本 htmlText:

    QTextEdit textEdit;    textEdit.setFont(font);    textEdit.setFontItalic(true);    textEdit.setTextColor(QColor(100, 100, 100));    textEdit.setText("纯文本PlainText");    qDebug() << "toHtml " << textEdit.toHtml() << endl;

若设置文本setText 函数放在设置样式代码的前面:

textEdit.setText("纯文本PlainText");
或者创建QTextEdit 时用的是:

QTextEdit textEdit("PlainText");
则得到的Html 富文本只有字体类型和大小,再无其他格式。

2. QTextEdit 可以获取富文本的高度,判断是否越界。

通过使用QTextCursor,将光标移动到 Document 的LastBlock 的LastFragment,用cursorRect 函数获取光标在Document 的位置,即获取了最大高度。

void resizeHtmlText(QString& htmlText, const QSizeF& rcf){    QTextEdit *tmpEdit = new QTextEdit;    tmpEdit->setAlignment(Qt::AlignTop);    tmpEdit->setFrameShape(QFrame::NoFrame);    tmpEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);    tmpEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);    tmpEdit->setLineWrapMode(QTextEdit::WidgetWidth);    tmpEdit->setHtml(htmlText);    tmpEdit->resize(rcf.width(), rcf.height());    tmpEdit->move(100,50);    tmpEdit->show();    QTextDocument *textDoc = tmpEdit->document();    QTextCursor textCursor(textDoc);    QTextBlock lastBlock = textDoc->lastBlock();    QTextBlock::iterator it = lastBlock.end();    if(it != lastBlock.begin()) it--;    if(it.atEnd()) break;    QTextFragment lastFragm = it.fragment();    int pos = lastFragm.position() + lastFragm.length();    textCursor.setPosition(pos, QTextCursor::MoveAnchor);    QRectF rcPos = tmpEdit->cursorRect(textCursor);qreal botm = rcPos.y() + rcPos.bottom();    if(botm - 4 > rcf.height())    // 4 QTextEdit Frame WidthqDebug() << "富文本高度越界";    tmpEdit->hide();delete tmpEdit;}

3. 与QPlainTextEdit 的区别

QPlainTextEdit 为纯文本的编辑框,QTextEdit 支持富文本。

setText 函数中 参数 text 的 ‘\n’ 会被QPlainTextEdit 识别为换行,而在后者识别为空格。由此,由‘\n’分割的多段(block)的纯文本,不能使用QTextEdit 来显示及计算位置等。


4. 由2 延伸,可获取规定尺寸下,富文本的换行位置,也就是每段block

的位置,在开放的文本绘制中可能会遇到(比如在空白纸上绘制,宽度会越界)。

    QTextEdit tmpEdit;    tmpEdit.setFrameShape(QFrame::NoFrame);    tmpEdit.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);    tmpEdit.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);    tmpEdit.setLineWrapMode(QTextEdit::WidgetWidth);    tmpEdit.setHtml(tmpHtmlText);    tmpEdit.resize(editBox.width(), editBox.height());    tmpEdit.move(-2000,-2000);    tmpEdit.show();// 因为用到光标QTextCursor,所以Edit必须show。    QTextDocument *textDoc = tmpEdit.document();    QTextCursor textCursor(textDoc);    QTextBlock block = textDoc->firstBlock();    QRect rcPos;    qreal tx, ty;    while(block.isValid())    {        for(QTextBlock::iterator it = block.begin(); !it.atEnd(); it++)        {            QTextFragment fragm = it.fragment();            QTextCharFormat charFmt = fragm.charFormat();            QString textStr = fragm.text();            int spos = fragm.position();// 文本块起始位置            int npos = spos;// 文本块结束位置            while(spos < fragm.position() + fragm.length())            {                textCursor.setPosition(npos, QTextCursor::MoveAnchor);                rcPos = tmpEdit.cursorRect(textCursor);                tx = rcPos.x();                ty = rcPos.y();                while(npos < fragm.position() + fragm.length()){                    textCursor.setPosition(npos + 1, QTextCursor::MoveAnchor);                    rcPos = tmpEdit.cursorRect(textCursor);                    if(qAbs(rcPos.y() - ty) > 0.1)                        break;    npos++;// 累加,直到rcPos.y() 与ty不相等,说明换行了                 }                tx += editBox.x();                ty += editBox.y();                textCursor.setPosition(spos, QTextCursor::MoveAnchor);                textCursor.setPosition(npos, QTextCursor::KeepAnchor);                rcPos = tmpEdit.cursorRect(textCursor);                QString tmpStr = textStr.mid(spos - fragm.position(), npos - spos);                spos = npos;// 字符     tmpStr // 文本格式 charFmt// 位置     tx,ty    }}block = block.next();    }





原创粉丝点击