类库大魔王
类库大魔王 多年C++、Go项目经验,长期从事跨平台(Windows/macOS/iOS/Android)应用架构设计与开发。

修正Qt app在Android 7上显示中文字符


今天手头上的Nexus 6通过OTA升级到了Android 7,之后发现几个用Qt写的App显示中文字符全变成方块了。这个问题在当时系统刚升级到6.0时也遇到过,解决办法是自己带一个中文字体,再在程序中指定使用这个中文字体。这是比较繁琐的解决方法,Qt官方也收到了问题报告,只不过修正后的版本还没有发布,但是问题报告下面有人提到了问题代码,所以要自己出个workaround也很容易,只要在自己的程序开头加这么一段代码就可以了:

1
2
3
4
5
6
7
    QDir dir("/system/fonts");
    const auto entries = dir.entryInfoList(QStringList() << "*.ttc" << "*.ttf" << "*.otf", QDir::Files);
    for (const QFileInfo& fi: entries)
    {
        qWarning() << fi.absoluteFilePath();
        QFontDatabase::addApplicationFont(fi.absoluteFilePath());
    }

另外顺便提一下,Qt要指定font family fallback其实并不复杂,之前还花了不少时间找到的:

1
2
3
4
    QFont font(qApp->font());
    listFonts << "Droid Sans" << "Source Han Sans" << "Noto Sans";
    font.insertSubstitutions(font.family(),listFonts);
    qApp->setFont(font);

再另外,macOS上JDK可能会有多个,javac可能有多个,其实只要在/Library/Java/JavaVirtualMachines/下面找就行了,选个最高的版本号,比如/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/,Qt Creator上编译Android app需要设置这个Home路径。

感觉本文不错,不妨小额鼓励我一下!
如果你有Visa、MasterCard之类的国际银行卡,也可以考虑以下选项:
如果你看不到评论框,说明Disqus被墙了。