如下图,我在将一个XML文本展示在QTextBrowser时,分段进行读取并展示。从42行开始时刚好为新的一段数据,将这段数据append进QTextBrowser时,出现了图2的问题,QT内部自动将这段数据识别成HTML文本,导致部分数据消失。
查看QT助手,QTextBrowser的append继承至QTextEdit;
继续查看QT源码,如下:
QWidgetTextControl *control;
void QTextEdit::append(const QString &text)
{
Q_D(QTextEdit);
const bool atBottom = isReadOnly() ? d->verticalOffset() >= d->vbar->maximum() :
d->control->textCursor().atEnd();
d->control->append(text);
if (atBottom)
d->vbar->setValue(d->vbar->maximum());
}
查看QWidgetTextControl文件:
void QWidgetTextControl::append(const QString &text)
{
Q_D(QWidgetTextControl);
d->append(text, Qt::AutoText);//在这里默认设置了参数Qt::AutoText,实际上我想使用Qt::PlainText
}
void QWidgetTextControlPrivate::append(const QString &text, Qt::TextFormat format)
{
QTextCursor tmp(doc);
tmp.beginEditBlock();
tmp.movePosition(QTextCursor::End);
if (!doc->isEmpty())
tmp.insertBlock(cursor.blockFormat(), cursor.charFormat());
else
tmp.setCharFormat(cursor.charFormat());
// preserve the char format
QTextCharFormat oldCharFormat = cursor.charFormat();
#ifndef QT_NO_TEXTHTMLPARSER
if (format == Qt::RichText || (format == Qt::AutoText && Qt::mightBeRichText(text))) {
tmp.insertHtml(text);
} else {
tmp.insertText(text);
}
#else
Q_UNUSED(format);
tmp.insertText(text);
#endif // QT_NO_TEXTHTMLPARSER
if (!cursor.hasSelection())
cursor.setCharFormat(oldCharFormat);
tmp.endEditBlock();
}
经过测试发现,QWidgetTextControlPrivate::append中将这段数据识别成了HTML文本,自动调用了QTextCursor::insertHtml函数。
因为QWidgetTextControl::append中默认调用了append(text, Qt::AutoText);
继续看QTextEdit::insertPlainText函数:
void QTextEdit::insertPlainText(const QString &text)
{
Q_D(QTextEdit);
d->control->insertPlainText(text);
}
void QWidgetTextControl::insertPlainText(const QString &text)
{
Q_D(QWidgetTextControl);
d->cursor.insertText(text);
}
发现,调用QTextEdit::insertPlainText,实际上程序内部调用更加简单,而且能直接调用QTextCursor::insertText函数。
如果确认自己插入的数据是HTML文本,也可以直接调用QTextEdit::insertHtml:
#ifndef QT_NO_TEXTHTMLPARSER
void QTextEdit::insertHtml(const QString &text)
{
Q_D(QTextEdit);
d->control->insertHtml(text);
}
#endif // QT_NO_TEXTHTMLPARSER
当然,使用insert时,最好确认光标不会被移动,否则就不知道插入到哪个位置了!
最后贴一下Qt::mightBeRichText的解释
bool Qt::mightBeRichText(const QString &text)
Returns true if the string text is likely to be rich text; otherwise returns false.
This function uses a fast and therefore simple heuristic. It mainly checks whether there is something that looks like a tag before the first line break. Although the result may be correct for common cases, there is no guarantee.
This function is defined in the <QTextDocument> header file.