10

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

2 回答 2

4

QFont 是对字体的请求,而不是对匹配的实际字体的描述;后者是QFontInfo。请参阅我的其他答案。可惜QFontInfo不给你rawName()如果有的话,有一种迂回的方法可以得到它,你不能保证它可以在所有平台上工作。

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

如果您正在寻找诸如字体之类的东西的标准位置,那么在 Qt 5 中您将使用QStandardPaths::standardLocationswith FontsLocation. 在 Qt 4 中,您将使用QDesktopServices::storageLocation.

于 2013-09-30T23:34:07.223 回答
0

尽管我正在使用 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 需要知道字体在哪里才能使用它,对吧?

于 2020-11-07T15:58:18.730 回答