QLineEdit Japanese/Chinese 字符未显示

QLineEdit Japanese/Chinese character not displayed

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

我必须如何配置 QLineEdit 编码才能使该字符可见?

看起来解决方案很简单。需要升级到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() (maybe in connection with previous [QFontDatabase] Defer the fallback families list initialization)。


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

例如,Windows 中有字体 "SimSun-ExtB" 支持 CJK 统一表意文字扩展 B。该字体可以手动设置到特定的 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 扩展的系统字体。