【问题标题】:QTextDocument eats multiple whitespacesQTextDocument 吃掉多个空格
【发布时间】:2011-02-28 20:04:30
【问题描述】:

有一个Qt/C++代码:

#include <QtCore/QCoreApplication>
#include <QtGui/QTextDocument>
#include <QByteArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextDocument *doc = new QTextDocument();

    qDebug() << " === Document was: === ";
    qDebug() << doc->toHtml(QByteArray());

    doc->setHtml("<p>THIS       IS      SPARTA</p>");

    qDebug() << " === Document now: === ";
    qDebug() << doc->toHtml(QByteArray());

    return a.exec();
}

它输出:

 === Document was: ===  
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Helvetica'; font-size:12pt; font-weight:400; font-style:normal;">
<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
<tr>
<td style="border: none;">
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html>" 
 === Document now: ===  
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Helvetica'; font-size:12pt; font-weight:400; font-style:normal;">
<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
<tr>
<td style="border: none;">
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">THIS IS SPARTA</p></td></tr></table></body></html>" 

如我所见,QTextDocument 中有类似默认 CSS 的内容:

<style type="text/css">p, li {white-space: pre-wrap;}</style>

但是,当我使用 p 标签和多个空格设置 HTML 时,它会删除空格。问题是——为什么? 另一个问题是 - 为什么要为 p 标签添加边距?

PS 如果我添加一行就可以了

doc->setDefaultStyleSheet("p, li { white-space: pre-wrap; }");

在执行 setHtml 之前 - 它不会删除多个空格。但是这个样式标签是什么?它不是默认样式表吗?为什么 Qt 会忽略它?

感谢您的回答。

【问题讨论】:

    标签: c++ qt qt4 qtextdocument


    【解决方案1】:

    这种行为来自html,html只是忽略标签内的多个空格..

    尝试使用空间的特殊代码:&amp;nbsp;

    #include <QtCore/QCoreApplication>
    #include <QtGui/QTextDocument>
    #include <QByteArray>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QTextDocument *doc = new QTextDocument();
        qDebug() << " === Document was: === ";
        qDebug() << doc->toHtml(QByteArray());
    
        QByteArray myhtml ="<p>THIS       IS      SPARTA</p>";
    
        doc->setHtml(myhtml.replace(" ","&nbsp;"));
    
        qDebug() << " === Document now: === ";
        qDebug() << doc->toHtml(QByteArray());
    
        return a.exec();
    }
    

    【讨论】:

    • 我知道,但是对于

    • 标签有一个带有“white-space: pre-wrap”的 CSS,所以不能删除空格。那就是问题所在! :(
    【解决方案2】:

    文档告诉您富文本对象支持哪些 CSS 标记 - white-space: pre-wrap 应该是受支持的,至少在我拥有的 Qt 4.7 文档中是这样。也许您应该在错误跟踪器中提出错误?

    【讨论】:

    • 是的,它受支持。当我将它设置为默认样式表时,它可以正常工作。问题是它忽略了它自己的默认 CSS。也许有人应该填写错误报告。我只是不知道,Qt 是否应该使用它(我的意思是,它是错误还是功能;))
    • 我个人会报告它,看看应该是什么正确的行为。也许它就像一个文档错误一样简单,或者它可能是一个真正的错误。您可以尝试挖掘源代码并找出:-)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签