如何使用qt5(QtQuick 2.1)及以上版本在窗口上打印度数符号

当我使用高达qt4.8(qt quick 1.1)为gui然后我成功地能够用\260打印学位但是当事情升级到qt5及以上然后这停止了工作。 我在网上搜索并找到许多相关的链接,如( http://www.fileformat.info/info/unicode/char/00b0/index.htm )我试过但没有帮助。 我是否需要为usinf UTF格式包含一些库,否则问题就是其他问题。 请一些帮助。 该怎么办?

@Revised,这里描述了正在做什么。

首先,我将可打印语句存储在字符串text 。 如在cpp函数中: –

  sprintf(text, "%02d\260 %03d\260 ",latD, longD); QString positionText(text.c_str()); return positionText; 

然后在qml文件中使用positionText在窗口上显示。

所以,有人请回答我需要做什么才能获得学位?

谢谢。

问题很简单你使用\260最可能在Ansii C-string( const char [] )里面。 在这种情况下,Qt使用一些编解码器将其转换为Unicode字符。 出于某种原因,当您更改Qt版本时,默认编解码器已更改,这就是它停止工作的原因。

无论如何你的方法是错误的。 你不应该使用编解码器所依赖的C字符串(通常会导致这种问题)。 您可以将QChar const定义为QChar(0260)或者最好的方法是使用tr并提供转换。

如果你给出具有学位字符的字符串的代表性例子,那么最好有人会为你提供最好的解决方案。


编辑:

我会改变你的代码:

 const QChar degreeChar(0260); // octal value return QString("%1%3 %2%3").arg(latD, 2, 10, '0').arg(longD, 3, 10, '0').arg(degreeChar); 

或添加将处理此行的翻译:

 return tr("%1degree %2degree").arg(latD, 2, 10, '0').arg(longD, 3, 10, '0'); 

请注意,此行的此转换只需始终添加,无论当前区域设置是什么。

尝试

 return QString::fromLatin1(text); 

或者,如果这不起作用,另一个静态QString :: fromXXX方法。

QT5将Qt的默认编解码器从Latin-1更改为UTF-8,如下所述: https : //www.macieira.org/blog/2012/05/source-code-must-be-utf-8-and-qstring-希望-IT /

Latin-1和Unicode都使用1760xB00260 )作为度符号,因此您对它的使用巧合,因为它被解释为Latin-1并在Unicode中转换为相同的值。

第一行可以改为:

 sprintf(text, "%02d\302\260 %03d\302\260 ",latD, longD); 

如前所述,直接转到QString确实更好,但如果你必须通过std::string ,你可以简单地替换Unicode 176的UTF-8编码,其中低6位110000将有10前置,高2位10 ,将在第一个字节中加上110000 。 这变为: \302\260