0

QLabelの同じ文字列内にいくつかの国際スクリプトを表示する必要があります。

たとえば、QLabelは次のように表示できます。

چاچيचाचीćāćī(ćāćā、qvの寸法)、sf父方の叔母(=ćaćī、qv)

上記の文字列には、ラテン文字、ペルソアラビア語文字、デーバナーガリー文字(インド文字のファミリーに属する)が含まれています。

スクリプトごとに異なるフォントファミリとサイズが必要です。たとえば、文字列の最初の単語はウルドゥー語であり、を表示できるフォントが必要ですے。さらに、特定の種類の書道を使用したい場合があります(ウルドゥー語は伝統的に「Nastaleeq」スクリプトを使用します)。さらに、書道では、読みやすくするためにフォントサイズを大きくする必要がある場合があります(すべてのスクリプトが北京語のピクトグラムのように通常の正方形に分類されるわけではありません。国際的なスクリプトの多様性についてほとんど理解していない場合は、Omniglotをご覧ください)。特定のフォントとサイズで表示されるスクリプト。

現在、文字列の特定のセクションに使用するフォントとサイズを指定して少しずつ作成する複雑なHTML文字列をQLabelにフィードしています。

<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

編集

基本的に、あなたの質問はユニコードに関するものであり、ユニコード コード ポイントへのスクリプト名の割り当てをサポートしているようです。理論的には、Qt は Unicode データベースを使用してレンダリングする各テキスト文字のスクリプトを決定し、その情報を使用して別の形式を適用する可能性があります。

ただし、これをサポートする明らかな API はないようです。

たとえば、QCharクラスがenumfor unicode スクリプト名scriptName、特定の unicode 文字に対して適切な値を返す関数を持っている可能性はもっともらしいと思われます。しかし、Qt4 にも Qt5 にもそのようなものはありません。

だから私はここに首を突っ込んで、html/cssが現時点であなたが望むものを達成する唯一の方法だと推測します.

アップデート

Python のunicodedataモジュールもスクリプト名をサポートしていないようです。

ただし、この回答は、自家製のソリューションを開発できる可能性がある回避策を提供します。

上記の回答からunicodedata2モジュールQLabelを使用して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 に答える