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

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 Width
	qDebug() << "富文本高度越界";

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





  • 15
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值