emoji 表情符号在互联网上经常遇到,也已经进行了标准化,每个emoji 表情符号在Unicode上都有相应的存在。在不同系统下,各个emoji 都会有系统相应的字符来展示。 不同系统下显示的笑脸

在正常情况下,我们只要找出对应的Unicode编码,Qt 就会展示出对应系统中的样子。这个是我 Ubuntu 19.04 中,QLabel 中文本u"I'm a happy \U0001F600" 显示的 emoji 笑脸
emoji in ubuntu 19.04

展示效果比较简陋,为了展示上面那种色彩丰富的表情,我们可以通过设置使用 emoji 的字体来丰富展示效果。这里我用了 Google 的 emoji 字体。在 PyQt5 中可以通过添加该字体来提升效果:

from PyQt5 import QtGui, QtWidgets

QtGui.QFontDatabase.addApplicationFont('font/NotoColorEmoji.ttf')
lb = QtWidgets.QLabel()
lb.setFont(QtGui.QFont('NotoColorEmoji'))
lb.setText(u"I'm a happy \U0001F600")

展示效果变成下面这种 添加字体后的 emoji 笑脸

不过这里也发现一个问题就是,因为设置成使用 emoji 字体,会把文本中可以转换为 emoji 的字符都转换成了 emoji 的样子,如文本 I'm a happy \U0001F600 2019 年 6号 机器人中的数字部分都变成了 emoji 中的数字。 数字也变成 emoji

这里我想实现的效果是类似 word 中的效果,英文用英文字体,中文用中文字体。不过QFont里不知道怎么添加多个字体,搜索了一翻,发现可以 利用 Qt StyleSheets 来修改样式, Qt StyleSheets 语法类似 CSS,在这里我们可以设置多个字体。

#lb.setFont(QtGui.QFont('NotoColorEmoji'))
lb.setStyleSheet("QLabel{padding-top:0;font-family:Arial,NotoColorEmoji;font-size:15px}")

上面添加了 Arial 和 emoji 的字体,非 emoji 字符可以用 Arial 字体。最终的效果变成下面这样 正确设置字体样式

emoji 输入

有的输入法中可以输入 emoji 表情。如果没有输入法没有类似的功能,我们可以利用 emoji 的代号,这里代号对照表,我参考的是这个项目emoji。在源码中列出一大串 emoji 代号,如:thumbs_up: 表示 👍,可以通过正则等来查找这个代号并替换为相应的 Unicode 就可以。