Qt 添加第三方字体库

        Qt字体库默认主持操作系统所有的字体库,但是设计师一般喜欢比如思源字体,但是咱们的操作系统没有安装,在其他没有安装第三方字体库的电脑上运行,就达不到设计师最初设计的观感。这篇博客介绍Qt如何第三方字体库,以思源字体为例介绍。

一、下载字体库

        csdn下载地址: 思源字体库下载地址.otf格式

二、添加字体库

三、QFontDatabase概述

QFontDatabase类提供了关于底层窗口系统中可用字体的信息。

详细资料请参看Qt官网:QFontDatabase Class - Qt 3.0.5 Documentation

1、获取系统所有字体族信息

QFontDatabase database;
foreach (const QString &strFamily, database.families()) {
	qDebug()<<strFamily.toStdString().c_str();
	foreach (const QString &strStyle, database.styles(strFamily)) {
		QString strSizes;
		foreach (int points, database.smoothSizes(strFamily, strStyle))
			strSizes += QString::number(points) + " ";
		qDebug()<<"\t"<<strStyle.toStdString().c_str()<<"\t"<<strSizes.toStdString().c_str();
	}
}

2、给应用程序添加可使用的字体

int QFontDatabase::addApplicationFont(const QString &fileName)


从fileName指定的文件中加载字体,并使其对应用程序可用。返回一个ID,可以用removeApplicationFont()再次删除字体,或者检索字体中包含的姓氏列表。如果字体无法加载,则函数返回-1。

QStringList QFontDatabase::applicationFontFamilies(int id)

返回由id标识的给定应用程序字体的字体族列表。

四、组织代码

#include "widget.h"
#include "ui_widget.h"

#include <QFontDatabase>
#include <QDebug>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);

    setFont(&(ui->boldBtn), ":/font/SourceHanSansCN-Bold.otf");
    setFont(&(ui->ExtraLightBtn), ":/font/SourceHanSansCN-ExtraLight.otf");
    setFont(&(ui->heavyBtn), ":/font/SourceHanSansCN-Heavy.otf");
    setFont(&(ui->LightBtn), ":/font/SourceHanSansCN-Light.otf");
    setFont(&(ui->MediumBtn), ":/font/SourceHanSansCN-Medium.otf");
    setFont(&(ui->NormalBtn), ":/font/SourceHanSansCN-Normal.otf");
    setFont(&(ui->regularBtn), ":/font/SourceHanSansCN-Regular.otf");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::setFont(QPushButton **push, QString fontPath){
    int loadedFontId = QFontDatabase::addApplicationFont(fontPath);
    QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontId);
    for(int i =0 ; i < loadedFontFamilies.size() ; i++){
        QString sansCNFamily = loadedFontFamilies.at(i);
        if(i == 0 ){
            QFont defaultFont = (*push)->font();
            //设置字体大小格式为pixel,字体占用固定像素。相同像素的大小屏,不会发生字体遮挡现象
            defaultFont.setFamily(sansCNFamily);
            defaultFont.setPixelSize(15);
            (*push)->setFont(defaultFont);
        }

        qDebug()<<"defaultFont:" << sansCNFamily ;
    }
}

运行结果:

        

以上代码只是在为了测试Qt如何加载第三方字体,但是在开发过程当中不建议这样使用。直接在main函数中去添加整个软件的字体,控件只是设置字体大小即可,代码如下:

#include <QApplication>
#include <QStandardPaths>
#include <QDesktopWidget>
#include <QTranslator>
#include <QTextCodec>

void setDefaultFont(QApplication *app){
    int loadedFontId = QFontDatabase::addApplicationFont(":/config/font/SourceHanSansCN-Normal.otf");
    QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontId);
    for(int i =0 ; i < loadedFontFamilies.size() ; i++){
        QString sansCNFamily = loadedFontFamilies.at(i);
        if(i == 0 ){
            QFont defaultFont = (app)->font();

            //设置字体大小格式为pixel,字体占用固定像素。相同像素的大小屏,不会发生字体遮挡现象
            defaultFont.setFamily(sansCNFamily);
            defaultFont.setPixelSize(15);
            (app)->setFont(defaultFont);
        }

        qDebug()<<"defaultFont:" << sansCNFamily ;
    }
}

int main(int argc, char **argv)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
#endif

    QApplication app(argc, argv);

 
    setDefaultFont(&app);

    loginView login;

    login.show();
    return app.exec();
}

这样就为系统设置好了默认字体。

五、未解决的问题

思源字体也确实好看,但是利用上面方法添加字体库之后,有些界面不生效,想请教各位网友如何解决,可以在评论区讨论

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值