【问题标题】:QLineEdit Japanese/Chinese character ???? not displayedQLineEdit 日文/中文字符 ????不显示
【发布时间】:2015-09-17 05:42:45
【问题描述】:

我有一个 QLineEdit,用户将在其中输入一个名称(不一定是人名),并且不会呈现字符。 它看起来像:

如何配置 QLineEdit 编码以使该字符可见?

【问题讨论】:

  • 你试过QLocale 吗?作为lineEdit.setLocale(QLocale::Chinese);
  • 还是不行...
  • QtCreator (3.2, Qt 5.3) 本身无法正确显示该字符。该版本的 Qt 完全支持 Unicode 6.2。确保为 6.2 定义了该字符:unicode.org/Public/6.2.0/charts/CodeCharts.pdf
  • 这不是语言环境问题。 Qt(它的所有 UI 组件)都支持 Unicode,因此只要字体包含其图形表示,您就应该能够透明地使用 unicode 字符而不会出现任何问题。我认为问题在于象形文字是在 Unicode 6.2 之后引入的。 (顺便说一句,与 OSX 10.9 支持的版本相同)。
  • TL;DR:目前看来至少 Qt 5.3 仍然无法处理这个字符。尝试使用最新版本。不过,您可以轻松地修补 Qt 以添加对这个字符的支持。

标签: string qt unicode utf-8 utf-16


【解决方案1】:

看起来解决方案很简单。需要升级到 Qt 5.5.1。

符号在基于 Qt 5.5.1 的 Qt Creator 3.5.1 的编辑器中也正确显示。在 Qt Creator 3.2.1(基于 Qt 5.3.2)中,该符号不显示。

符号在 Qt 5.3.2 的 UI 控件中显示为矩形。但是,如果项目是由 Qt 5.5.1 构建的,它可以正确显示在标签和其他文本控件中。


如果 UI 控件的默认字体中不存在此类字符,似乎至少需要 Qt 5.5.1 才能找到它。

默认字体回退机制仅在 Qt 5.5.1 中实现,所以即使在 Q 5.5.0 中,如果在所选字体中找不到字符,也无法正确显示该字符。

我猜想改进是由 Qt 提交 5e3e34731b7880ac775e8f1fa156ce016e6820f1 Default implementation for QPlatformFontDatabase::fallbacksForFamily() 完成的(可能与之前的 [QFontDatabase] Defer the fallback families list initialization 有关)。


但是,仍然可以在旧 Qt 版本中显示该字符(即使在 Qt4 中)。可以手动设置支持所需符号的字体。

例如,Windows 中有支持 CJK Unified Ideographs Extension B 的字体“SimSun-ExtB”。该字体可以手动设置到特定的 UI 小部件或整个应用程序:

QFont CJK_ExtB("SimSun-ExtB");
// font for widget
ui->lineEdit->setFont(CJK_ExtB);
// or default application font
QApplication::setFont(CJK_ExtB);

当然要显示一个字符,它应该可以在某些系统字体或应用程序加载的字体中使用。 Windows 7 默认具有CJK Ext.B 的字体,但要显示来自CJK-CCJK-D 的符号需要一些其他字体。例如,有一个免费的 Unicode CJK 字体BabelStone Han 涵盖了一些此类符号。可以手动加载应用:

QFontDatabase::addApplicationFont("c:/test/BabelStoneHan.ttf");

如果使用 Qt 5.5.1,现在应用程序能够自动查找 Windows 系统字体“SimSun-ExtB”中的CJK-B 符号和“BabelStoneHan”中的CJK-C 符号。


Qt 5.5.1 中的字体回退改进主要影响 Windows,因为在 Ubuntu Linux 中,即使使用较旧的 Qt 版本,应用程序也能够为符号找到正确的字体(如果字体是由 QFontDatabase::addApplicationFont 添加的,因为没有系统默认为 CJK 扩展的字体)。

【讨论】:

  • @JacobKrieg 请注意,无论如何,系统中应该有一些字体可以显示所需的字符。可能需要在应用程序中提供一些字体,因为默认情况下,操作系统没有适用于所有 CJK 扩展的字体。
猜你喜欢
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
相关资源
最近更新 更多