我想检索带有扩展名的字体文件路径(例如“arial.ttf”)。
QFont :: rawname ()方法始终返回“ unknown ”。
是否有其他方法可以获取字体的名称和扩展名?
以下是我们使用的代码:
bool ok = true;
QFont font = QFontDialog::getFont(&ok, this);
if(ok)
{
QString fontpath = "/Library/Fonts/" + font.family()+".ttf";//Using font file path in the application
}
答案 0 :(得分:1)
QFont是对字体的请求,而不是对匹配的实际字体的描述;后者是QFontInfo
。查看我的other answer。很遗憾,QFontInfo
并未向您提供rawName()
。有一种迂回的方式来获取它如果完全,你不能保证它可以在所有平台上运行。
QFont myFont;
QFontInfo info(myFont);
QFont realFont(info.family());
QString rawName = realFont.rawName();
如果您正在寻找字体等内容的标准位置,那么在第5季度,您将QStandardPaths::standardLocations
与FontsLocation
一起使用。在Qt 4中,您将使用QDesktopServices::storageLocation
。
答案 1 :(得分:0)
尽管我正在Python中工作,但我仍需要做同样的事情。我正在使用PyQt界面选择字体,但使用PIL绘制文本,PIL需要使用字体的文件路径(或至少是文件名)才能使用它。到目前为止,我只得到一个大致的部分答案-希望我能对您有所适应。
您可以做的是首先通过QStandardPaths
获取字体所在的路径-然后使用QFontDatabase
遍历字体路径中的文件,然后通过{{1 }}。如果加载,您将获得索引;然后将其馈送到数据库的addApplicationFont
函数。这样只会为您提供字体系列名称,但是您可以使用它来将名称映射到文件路径。
您无法通过此方法区分确切的字体(C:/Windows/Fonts/HTOWERT.TTF和C:/Windows/Fonts/HTOWERTI.TTF都返回相同的家族名称,但第二个字体是斜体),因此这不是一对一的映射,我不确定它是否还适用于非真型字体(.ttf),但这至少是一个开始。
这是Python中的样子:
applicationFontFamilies
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
我发现有点奇怪,因为没有真正的方法将字体映射到它们的位置。我的意思是,在某个时候 Qt需要知道一种字体才能使用它,对吧?