0

我需要在 QLabel 中的同一字符串中显示多个国际脚本。

例如 QLabel 可以显示:

چاچي चाची ćāćī(ćāćā 的小字,qv),sf 姑姑(=ćaćī,qv)

上述字符串包括拉丁文字、波斯-阿拉伯文字和梵文(属于印度文字家族)。

每个脚本需要不同的字体系列和大小。例如,字符串中的第一个单词是 Urdu,并且需要能够显示的字体ے。此外,我可能想使用某种类型的书法(乌尔都语传统上使用“Nastaleeq”脚本)。此外,书法可能需要增加字体大小才能阅读(并非所有文字都像普通话象形文字一样属于规则的方形,如果您对国际文字的多样性知之甚少,请查看Omniglot。)以特定字体和大小显示的脚本。

目前,我为 QLabel 提供了一个复杂的 HTML 字符串,我通过指定用于字符串特定部分的字体和大小来逐位编写该字符串。

<font family="SomeFamilyforUrdu" size="10>اردو</font> <font family="SomeFamilyforDevanagari" size="8">हिन्दी</font> <font family="FontforLatin" size=5>English</font>

Qt4 也提供了QLabel.setFont(QFont),但到目前为止我还没有看到任何根据脚本系列指定字体系列和大小的方法。

是否可以为 QFont 设置条件,以便根据它绘制到 QLabel 中的脚本应用不同的系列和大小?

4

1 回答 1

2

QFontDatabase.families()函数返回支持特定字体的列表Writing System

编辑

从根本上说,您的问题似乎与 unicode 有关,它支持将脚本名称分配给 unicode 代码点。从理论上讲,Qt 可以使用 unicode 数据库来确定它呈现的每个文本字符的脚本,并可能使用该信息对其应用不同的格式。

但是,似乎没有任何明显的 API 对此提供支持。

例如,QChar类可能有一个enum用于unicode 脚本名称和一个scriptName函数,该函数将从它返回一个特定 unicode 字符的适当值,这似乎是合理的。但是在 Qt4 或 Qt5 中都没有这样的东西。

所以我要在这里伸出我的脖子,并猜测 html/css 是在这个时间点实现你想要的唯一方法。

更新

似乎 python 的unicodedata模块也不支持脚本名称。

但是,此答案提供了一种解决方法,可以潜在地允许开发本土解决方案。

这是一个演示脚本,它QLabel使用上面答案中的unicodedata2模块为 a 自动生成 html:

# -*- coding: utf8 -*-

import unicodedata2
from itertools import groupby
from PyQt4 import QtGui, QtCore

text = (u'چاچي चाची ćāćī (dim. of ćāćā, q.v.), '
        u's.f. A paternal aunt (=ćaćī, q.v.)')

markup = [
"""
<html>
<style type="text/css">
body {font-family: Sans Serif; font-size: 8pt}
span.arabic {font-family: ClearlyU Arabic; font-size: 18pt}
span.devanagari {font-family: ClearlyU Devanagari; font-size: 12pt}
</style>
<body>
"""
]

for script, group in groupby(text, unicodedata2.script):
    script = script.lower()
    chunk = ''.join(group)
    if script == 'common' or script == 'latin':
        markup.append(chunk)
    else:
        markup.append('<span class="%s">%s</span>' % (script, chunk))

markup.append(
"""
</body>
</html>
"""
)

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.label = QtGui.QLabel(self)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.label)
        self.label.setText(''.join(markup))

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
于 2012-08-16T17:51:52.103 回答