如何使用PyQt正确显示所有Unicode字符?

时间:2016-03-17 18:33:09

标签: c++ qt unicode pyqt

我试图在PyQt上显示一些Unicode字符(我的版本是PyQt4,来自Windows上的Anaconda)。出于某种原因,它可以在Qt Creator上使用C ++项目(但使用Qt5),但是在使用PyQt时,某些字符显示白色框。

测试案例:

作为测试,我制作了一个显示⏩角色的简单应用。我在QLabel上使用了"⏩"文字和HTML "<html><head/><body><p>&#9193;</p></body></html>"

这适用于C ++:

#include <QApplication>
#include <QLabel>
#include <QChar>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel w("<html><head/><body><p>&#9193;</p></body></html>");
    w.show();

    return a.exec();
}

但这显示了一个白色方框,字符应为:

from PyQt4 import QtCore, QtGui, uic, Qt

app = QtGui.QApplication([])
w = QtGui.QLabel("<html><head/><body><p>&#9193;</p></body></html>")
w.show()
app.exec_()

我还做了一个.ui表单并用C ++和PyQt加载它,结果相同。

问题:

这是Qt4中的一个错误,在Qt5中得到纠正,这是PyQt中的错误还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

这不是一个错误,你没有做错任何事。

要确认,您尝试显示的角色是:

>>> import html, unicodedata
>>> unicodedata.name(html.unescape('&#9193;'))
'BLACK RIGHT-POINTING DOUBLE TRIANGLE'

因此,大多数字体都不支持这个非常模糊的字符 - 包括我系统上的默认字体,即“DejaVu Sans”。事实上,我无法在我的系统上找到可以显示它的单一字体。我必须安装“Symbola”字体才能正常显示。

据推测,在您的系统上,Qt5和Qt4程序不使用相同的默认应用程序字体,这解释了PyQt4测试用例的行为差异。

修改

我在Windows上测试过 - 该字符也没有在那里显示,并且出于同样的原因:现有的字体都不支持该字符。所以我安装了“Symbola”,但是我必须在PyQt中将它显式设置为应用程序字体才能使字符正确显示。出于某种原因,usual mechanisms for partial font subsitution on Windows似乎没有正常工作 - 但我不知道为什么。唯一能自动正确显示角色的程序是Firefox。