您的位置:首页 > 编程语言 > Qt开发

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

2017-08-03 14:21 846 查看
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  QTextEdit