5

QTextEdit t; t.setHtml(" ");显示带有尖锐重音的小“a”而不是不间断空格。这只发生在 Windows 上,而不是 Linux 或 FreeBSD。这可能是什么原因造成的?Windows/Qt 中的错误?我怎样才能解决这个问题?

(Windows Vista x64 pro 上的 Qt 4.5。我的语言环境是默认的“C”。)

更新:我感觉这是 Qt/Windows 中的错误(已经提交了错误报告)。我已经创建了一个解决方法,但它很丑陋,并且涉及更改我的格式算法并<pre> </pre>与 CSS 一起使用来产生所需的输出。

有没有更简单的解决方法?

更新:&8194; &8195; 两者都按照“wcm”的建议工作。假设这也适用于其他用户是否安全? &nbsp;不工作可能仍然是一个错误,但是 &8194; 似乎是一个可接受的解决方法(?)。

更新:原来我错过了一些重要的事情:&nbsp;在 Qt/Windows 中,仅使用我使用的称为“终端”的特定单型字体才能正确呈现。当我切换到“Lucida Console”(或任何其他字体)时,&nbsp;渲染正确!伙计,我真希望我早点注意到这一点!该死。所以很明显某处存在错误(很可能在Qt中)。但没关系,至少对我来说使用不同的字体已经解决了这个问题。

更新:这不是我之前认为的 Qt 中的错误。&nbsp;要了解渲染不正确的原因,请参阅 Tewha 的回答。

[解决了]

4

7 回答 7

2

对这个主题不太了解,所以对此持保留态度,但是您是否尝试过其中一个 unicode 变体,例如&#160;or&#8194;&#8195;

我自己不使用 QT,但是我在使用 XML/XSLT 生成的一些文档时遇到了这个问题。使用&#160;为我解决了这个问题。

于 2009-05-18T12:29:28.970 回答
2

我看到你基本上已经弄清楚了,但我想我会添加它的“为什么”。终端字体基于代码页 437,即 DOS-US。á 位于 160 位。

代码页 437 的字体并不多。事实上,我认为 Terminal 是唯一的 TrueType 字体!无论如何,如果您没有明确地尝试显示老式的 DOS 图形,那么您不应该使用终端。

什么是代码页 437?它是“高 ASCII”,大约 1981 年。除了通常的 32-127 个字符外,它还包括一些重音字母、用于在事物周围绘制边框的方框图形字符、一些数学符号,甚至是四张牌的符号!但是世界以不同的方式发展,因此除了 32-127 之外,即使是通常以其他字体提供的字形也不是您期望的。如果您在窗口中运行旧的文本模式 MSDOS 程序,它将使用代码页 437 字体。

有关更多信息,请参阅“代码页 437 ”(维基百科)。

于 2009-05-21T00:39:59.143 回答
1

我最好的猜测是: t.setHtml("<html> </html>");

t.setHtml("<html>&nbsp;</html>");
于 2009-05-11T16:04:46.093 回答
1

我实际上在文档(此处)中看不到任何关于它是否支持 & 号项目的内容。您可能想测试其他一些,例如"&amp;""&lt;"

提到了对标签的支持,因此nobr可能可以获得类似的效果(这是这些标签之间的空格):

QTextEdit t;
t.setHtml("<nobr> </nobr>");
于 2009-05-12T11:27:48.910 回答
1

我使用 Qt 4.5.0 在 Mac 上对此进行了测试。非破坏空间实体与其他实体一起工作得非常好。我所做的只是修改 Qt 4 附带的 MDI 示例项目中的源代码。

MdiChild继承了QTextEdit,所以在mdichild.cpp中,我setHtml()在构造函数中添加了调用:

mdichild.cpp http://krsna.ca/dev/images/mdichild.png

这产生了以下 QTextEdit,包含所有实体,包括不间断空格:

MDI 截图 http://krsna.ca/dev/images/mdi-screenshot.png

我的猜测是这是一个 Windows 错误。

于 2009-05-16T04:00:11.910 回答
1

我使用 Qt 4.5.0 在 Windows XP SP3 x32 下对其进行了测试,它按预期工作。不确定这是否可能是您的 Windows 语言环境或 x64 特定错误的问题,尽管我对此表示怀疑。

于 2009-05-18T14:57:04.600 回答
0

我会考虑做类似的事情来创建在 QtextEdit(或 QTextBrowser)中工作的空格:

QString msg = "Some   Text   with  3   Whitespaces";
msg.replace(" ","&nbsp;");

然后所有空格将被替换为 html 代码   ; (硬编码空格)这对我来说效果很好。

编辑:抱歉,这只适用于以下情况:

msg.prepend("<font></font>");

我不明白为什么(标签已关闭,所以有意义吗?)也许有人想解释一下...

于 2014-12-04T13:12:53.847 回答