Python 如何使用QFontDialog预览非系统字体

Python 如何使用QFontDialog预览非系统字体,python,fonts,pyqt,external,preview,Python,Fonts,Pyqt,External,Preview,我想在安装外部字体之前使用QFontDialog小部件预览它们。但是,默认情况下,QFontDialog显然只列出已安装的系统字体 有没有办法为QFontDialog指定自定义字体文件夹 如果没有,是否有其他小部件更适合作为字体预览器 您不能指定自定义字体文件夹,但可以使用类添加单个字体。因此,您所需要做的就是迭代给定文件夹中的文件,并添加其中包含的任何字体文件。文件中指出了这些限制: 目前只有TrueType字体、TrueType字体集合和OpenType 支持字体 注意:在Unix/X11

我想在安装外部字体之前使用QFontDialog小部件预览它们。但是,默认情况下,QFontDialog显然只列出已安装的系统字体

  • 有没有办法为QFontDialog指定自定义字体文件夹
  • 如果没有,是否有其他小部件更适合作为字体预览器

您不能指定自定义字体文件夹,但可以使用类添加单个字体。因此,您所需要做的就是迭代给定文件夹中的文件,并添加其中包含的任何字体文件。文件中指出了这些限制:

目前只有TrueType字体、TrueType字体集合和OpenType 支持字体

注意:在Unix/X11平台上添加应用程序字体 fontconfig当前不受支持

一旦添加了所有有效的字体文件,它们将立即显示在字体对话框中。下面是一个简单的演示(仅在Linux上测试):

import sys, os, glob
from PyQt5 import QtCore, QtGui, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.button1 = QtWidgets.QPushButton('Open Font Folder')
        self.button1.clicked.connect(self.handleButton1)
        self.button2 = QtWidgets.QPushButton('Show Font Dialog')
        self.button2.clicked.connect(self.handleButton2)
        self.fontList = QtWidgets.QListWidget()
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.fontList)
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)

    def handleButton1(self):
        path = QtWidgets.QFileDialog.getExistingDirectory(self)
        if path:
            fonts = set()
            self.fontList.clear()
            db = QtGui.QFontDatabase()
            db.removeAllApplicationFonts()
            for filename in glob.glob(os.path.join(path, '*.ttf')):
                fontid = db.addApplicationFont(os.path.join(path, filename))
                if fontid >= 0:
                    fonts.update(db.applicationFontFamilies(fontid))
            self.fontList.addItems(sorted(fonts))
            self.fontList.setCurrentRow(0)

    def handleButton2(self):
        font = QtGui.QFont()
        item = self.fontList.currentItem()
        if item is not None:
            font.setFamily(item.text())
        QtWidgets.QFontDialog.getFont(font, self)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 200, 200)
    window.show()
    sys.exit(app.exec_())