如何在Qt中使用QFont获取字体文件路径?

如何在Qt中使用QFont获取字体文件路径?,qt,fonts,filenames,filepath,Qt,Fonts,Filenames,Filepath,我想检索字体文件路径及其扩展名(例如“arial.ttf”) QFont::rawname()方法始终返回“unknown” 有没有其他方法可以获取字体的名称和扩展名 以下是我们使用的代码: bool ok = true; QFont font = QFontDialog::getFont(&ok, this); if(ok) { QString fontpath = "/Library/Fonts/" + font.family()+".ttf"

我想检索字体文件路径及其扩展名(例如“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
    }

QFont是对字体的请求,而不是对匹配的实际字体的描述;后者是
QFontInfo
。看我的。不幸的是,
QFontInfo
没有为您提供
rawName()
。如果你不能保证它能在所有平台上运行,那么有一种迂回的方法来实现它

QFont myFont;
QFontInfo info(myFont);
QFont realFont(info.family());
QString rawName = realFont.rawName(); 

如果您正在寻找字体等事物的标准位置,那么在Qt5中,您将使用
qstandardpath::standardpocations
FontsLocation
。在Qt4中,您将使用
QDesktopServices::storageLocation

我也需要做同样的事情,尽管我使用的是Python。我使用PyQt接口来选择字体,但是使用来绘制文本,PIL需要字体的文件路径(或者至少是文件名)来使用它。到目前为止,我只有一个大致的部分答案——希望我的答案能让你适应

您可以做的是首先通过
qstandardpath
获取字体所在的路径-然后使用
QFontDatabase
,在字体路径上迭代文件,并通过
addApplicationFont
将其加载到数据库中。如果它加载,您将得到一个索引;然后将其馈送到数据库的
applicationFontFamilies
函数。这只提供字体族名称,但您可以使用该名称将名称映射到文件路径

您无法通过此方法区分确切的字体(C:/Windows/fonts/HTOWERT.TTF和C:/Windows/fonts/HTOWERTI.TTF都返回相同的姓氏,但第二个是斜体),因此这不是一对一映射,我不确定它是否适用于非真实类型字体(.TTF),但至少是一个开始

在Python中,它可能是这样的:

从PySide2.QtCore导入qstandardpath
从PySide2.QtGui导入QFontDatabase
从PySide2.QtWidgets导入QApplication
导入系统,操作系统
def getFontPath():
font_PATH=QStandardPaths.StandardLocation(QStandardPaths.FontsLocation)
占比=[]
不可加载=[]
族到路径={}
db=QFontDatabase()
对于字体路径中的fpath:#遍历所有字体路径
对于os.listdir(fpath)中的文件名:#遍历每个路径中的所有文件
path=os.path.join(fpath,文件名)
idx=db.addApplicationFont(路径)#添加字体路径
如果idx<0:unloadable.append(path)#如果idx为-1,则未加载字体
其他:
name=db.applicationFontFamilies(idx)#加载字体族名称
对于名称中的n:
如果n在族_到_路径中:
accounted.append((n,路径))
其他:
族到路径[n]=路径
#例如,这不是1:1映射
#“C:/Windows/Fonts/HTOWERT.TTF”(常规)和
#“C:/Windows/Fonts/HTOWERTI.TTF”(斜体)是不同的
#但applicationFontFamilies将为这两种类型返回“高塔文本”
返回不可加载项,族路径,已记帐
>app=QApplication(sys.argv)
>>>不可加载,族到路径,accounted=GetFontPath()
>>>家庭到家庭路径['Comic Sans MS']
'C:/Windows/Fonts\\comic.ttf'

我觉得有点奇怪,没有真正的方法将字体映射到它们的位置。我的意思是,Qt需要知道字体的位置才能使用它,对吗?

你在哪个操作系统上?我在Mac OSX 10.7.5上。你可以使用QDesktopServices返回用户字体的路径。我认为系统字体路径有点棘手,因为它们在不同的系统之间变化很大。在大多数情况下,设置字体不一定需要绝对路径。设置字体的结果是什么?它是否会抛出错误消息?谢谢您的回答,但不幸的是,第一个解决方案对我不起作用。当我显示rawName时,它仍然返回unknown。我将尝试使用
QStandardPaths
。不能保证它会工作。实际上,它基本上是一个不受支持的API。你需要字体路径做什么?我使用一个需要字体路径的
setFont(QString-fontpath)
方法是的,它不是Qt方法。它使用SDL_ttf,并且需要.ttf文件来加载font.txt。看起来您需要特定于平台的方法来完成此操作,或者您可以将文本呈现为QImage并将其传递到SDL。有很多SDL功能与Qt重叠。