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

时间:2013-09-30 15:46:28

标签: 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";//Using font file path in the application
    }

2 个答案:

答案 0 :(得分:1)

QFont是对字体的请求,而不是对匹配的实际字体的描述;后者是QFontInfo。查看我的other answer。很遗憾,QFontInfo并未向您提供rawName()。有一种迂回的方式来获取它如果完全,你不能保证它可以在所有平台上运行。

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

如果您正在寻找字体等内容的标准位置,那么在第5季度,您将QStandardPaths::standardLocationsFontsLocation一起使用。在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需要知道一种字体才能使用它,对吧?