【问题标题】:Qt- Add custom font from resourceQt-从资源中添加自定义字体
【发布时间】:2015-09-07 12:58:11
【问题描述】:

我将此字体添加到资源中: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 上并没有什么不同。为什么?

【问题讨论】:

  • 试试QFont字体(":/images/font/BYekan.ttf"); nLabel->setFont(字体);
  • 我试过了,还是不行

标签: c++ qt fonts


【解决方案1】:

不,看,我没有做任何这些。所以对我来说,我所做的是有一个~/.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 字体原本黑暗而神秘的世界。

【讨论】:

  • 如果我将字体复制(或链接)到已识别的目录中,则不需要使用 addApplicationFont 的解决方案。就我而言,在 /usr/share/fonts 中没有找到该字体,但在 /usr/lib/fonts 中没有找到该字体。
【解决方案2】:

我遇到了与原始问题中报告的相同的问题。上面提出的解决方案(答案以“int id = QFontDatabase::addApplicationFont....

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

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

【讨论】:

  • 我可以看到您提供了一些有趣的额外见解(尽管这超出了我通常的能力范围)。但是,您的措辞很容易被误认为是“我也是”。或者你的一个问题。这可能(错误地和不应有地)让您陷入某种麻烦或其他麻烦。我建议重新措辞并强调您解释某些内容以解决在 cmets 中观察到的问题的部分。也许像“我想为上面 cmets 中描述的问题添加解决方案”这样开头。我认为这应该让你被公认为一个认真的贡献者。
  • 干得好。但是,“答案 1”是模棱两可的,请注意,用户可以按年龄、投票和活动对答案进行不同的排序。因此没有明确的编号。使用回答者的名字,也许是一个简短的总结。即使是“最旧的”(如果您是这个意思)也不可靠,因为答案可以删除和取消删除。
  • 请理解我不能投票,因为我对实际的技术问题一无所知
  • 请仔细阅读问题..他想从Qt资源系统加载字体..它通过前缀“:/”提供对文件的访问..你所说的只是不正​​确:原因是,有一个领先的':'
【解决方案3】:

在 QML 中你可以

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

【讨论】:

    【解决方案4】:
    int id = QFontDatabase::addApplicationFont(":/fonts/monospace.ttf");
    QString family = QFontDatabase::applicationFontFamilies(id).at(0);
    QFont monospace(family);
    

    【讨论】:

    • 如何使用? nLabel->setFont(等宽(家族));错误:不匹配调用 '(QFont) (QString&)'
    • 不,像这样。 nLabel->setFont(等宽);
    • id为-1,如果字体无法加载
    • 我注意到加载仅使用系统安装字体的应用程序比使用嵌入字体的应用程序快得多。我也尝试在 qrc 文件之外使用非压缩字体。但结果相同。
    • 在我的例子中,QFile::exists 返回 trueQFontDatabase::addApplicationFont 返回 -1。什么可能导致这种情况?
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多