尽管我正在使用 Python,但我需要做同样的事情。我正在使用 PyQt 界面来选择字体,但使用PIL来绘制文本,并且 PIL 需要字体的文件路径(或至少是文件名)才能使用它。到目前为止,我只有一个一般性的部分答案——希望我所拥有的你可以适应。
您可以做的是首先获取字体所在的路径 via-QStandardPaths
然后使用QFontDatabase
,遍历字体路径中的文件并将其加载到数据库中addApplicationFont
。如果它加载,你会得到一个索引;然后您将其提供给数据库的applicationFontFamilies
功能。这只会为您提供字体系列名称,但您可以使用它将名称映射到文件路径。
您无法通过此方法区分确切的字体(C:/Windows/Fonts/HTOWERT.TTF 和 C:/Windows/Fonts/HTOWERTI.TTF 都返回相同的姓氏,但第二个是斜体)所以这是' t 一对一的映射,我不确定它是否适用于非真字体 (.ttf),但至少是一个开始。
这是它在 Python 中的样子:
from PySide2.QtCore import QStandardPaths
from PySide2.QtGui import QFontDatabase
from PySide2.QtWidgets import QApplication
import sys, os
def getFontPaths():
font_paths = QStandardPaths.standardLocations(QStandardPaths.FontsLocation)
accounted = []
unloadable = []
family_to_path = {}
db = QFontDatabase()
for fpath in font_paths: # go through all font paths
for filename in os.listdir(fpath): # go through all files at each path
path = os.path.join(fpath, filename)
idx = db.addApplicationFont(path) # add font path
if idx < 0: unloadable.append(path) # font wasn't loaded if idx is -1
else:
names = db.applicationFontFamilies(idx) # load back font family name
for n in names:
if n in family_to_path:
accounted.append((n, path))
else:
family_to_path[n] = path
# this isn't a 1:1 mapping, for example
# 'C:/Windows/Fonts/HTOWERT.TTF' (regular) and
# 'C:/Windows/Fonts/HTOWERTI.TTF' (italic) are different
# but applicationFontFamilies will return 'High Tower Text' for both
return unloadable, family_to_path, accounted
>>> app = QApplication(sys.argv)
>>> unloadable, family_to_path, accounted = getFontPaths()
>>> family_to_path['Comic Sans MS']
'C:/Windows/Fonts\\comic.ttf'
我发现没有真正的方法将字体映射到它们的位置有点奇怪。我的意思是,在某些时候Qt 需要知道字体在哪里才能使用它,对吧?