Qt-从资源添加自定义字体

时间:2015-06-22 07:01:27

标签: c++ qt fonts

我将此字体添加到资源: BYekan.ttf
我想在我的应用程序中使用此字体。我试过这个:

    QFont font(":/images/font/BYekan.ttf");
    nLabel->setFont(font);
    nLabel->setText(tr("This is for test"));
    layout->addWidget(nLabel);

但是,我猜它不起作用。怎么用?

编辑: 阅读this question后,我再次尝试了:

int fontID(-1);
bool fontWarningShown(false);
QFile res(":/images/font/Yekan.ttf");
if (res.open(QIODevice::ReadOnly) == false) {
    if (fontWarningShown == false) {
        QMessageBox::warning(0, "Application", (QString)"Impossible d'ouvrir la police " + QChar(0x00AB) + " DejaVu Serif " + QChar(0x00BB) + ".");
        fontWarningShown = true;
    }
}else {
    fontID = QFontDatabase::addApplicationFontFromData(res.readAll());
    if (fontID == -1 && fontWarningShown == false) {
        QMessageBox::warning(0, "Application", (QString)"Impossible d'ouvrir la police " + QChar(0x00AB) + " DejaVu Serif " + QChar(0x00BB) + ".");
        fontWarningShown = true;

    }
    else
        nLabel->setFont(QFont(":/images/font/Yekan.ttf", 10));
}

我比较了这个字体和其他字体,但Qt没有任何不同。为什么呢?

4 个答案:

答案 0 :(得分:27)

int id = QFontDatabase::addApplicationFont(":/fonts/monospace.ttf");
QString family = QFontDatabase::applicationFontFamilies(id).at(0);
QFont monospace(family);

答案 1 :(得分:4)

在QML中你可以

FontLoader { id: font; source: "/fonts/font.otf" }

答案 2 :(得分:0)

我遇到了与原始问题相同的问题。上面介绍的解决方案(答案以“ int id = QFontDatabase :: addApplicationFont ....开始”)无效,正如上面的注释所示。addApplicationFont返回-1。

原因是,字符串中有一个开头的“:”,用于调用addApplicationFont函数。我删除了这个。现在它对我有用(在Linux上使用Qt 5.5.1和Qt 4.8.6的testet)并返回0。在Windows上,可能需要在前面添加驱动器号。

注意:我必须提供字体文件的完整路径(例如/usr/share/fonts/ttf/droid/DroidSansFallbackFull.ttf)

答案 3 :(得分:0)

不,看,我没有做任何这些。所以对我来说,我所做的是有一个 ~/.font/ 目录,如果它不存在,你可以创建它。

现在你把 ttf 复制到这个目录下,Linux 就会看到了。但是,就我而言,我正在编写一个 QT 应用程序,因此这些字体都有名称,那么 Linux 是如何知道名称的?

如果你运行命令:

fc-list

它会转储系统范围内的所有字体信息,您可以搜索您添加的字体。

输出看起来像这样:

...
/usr/share/texmf/fonts/opentype/public/lm/lmsans17-oblique.otf: Latin Modern Sans,LM Sans 17:style=17 Oblique,Italic
/home/XXX/.fonts/PAPYRUS.TTF: Papyrus:style=Regular,Normal,obyčejné,Standard,Κανονικά,Normaali,Normál,Normale,Standaard,Normalny,Обычный,Normálne,Navadno,Arrunta
/usr/share/fonts/X11/Type1/n019064l.pfb: Nimbus Sans L:style=Bold Condensed Italic
...

每行第一个冒号之后的输出部分是该用户从 Linux 内部看到的字体名称。所以这些是“Latin Modern Sans,LM Sans 17”/“Papyrus”/“Nimbus Sans L”。所以 Linux 会看到它,并且您以用户身份运行的所有应用程序也会看到它们,(Gimp、您的窗口管理器、QT 应用程序等)

在您的 QT 应用程序中,您称其为您感兴趣的应用程序,就我而言,我对 Papyrus 字体感兴趣:

tabWidget->setFont( QFont( "Papyrus",10 ) );

然后,果然 QT 应用程序只是选择了字体...

如果你想让字体在系统范围内,那么你必须找到字体目录的位置,从我所看到的是 /usr/share/fonts/truetype/ 你需要在那里为你的字体创建一个子目录但是也许其他一些发行版可能位于不同的位置,您可能需要仔细检查一下。无论如何,您可以将 ttf 文件转储到那里。如果这样做,您可能需要考虑运行 fc-cache -fv,因为这将遍历 truetype 子目录以查找新添加的字体。

对于 Linux 下的任何字体,运行 fc-list。它清除了各种混淆和误解,并为 Linux 字体的黑暗和神秘世界提供了线索。