Qt 添加第三方字体库

news2024/12/24 1:00:14

        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();
}

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

五、未解决的问题

思源字体也确实好看,但是在使用的过程中也发现了比较奇怪的问题,字体有些稍微浅一些,字体颜色不太均匀,至今未解决,希望看到朋友在评论区一起探讨!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML【基础篇】

HTML【基础篇】&#x1f34e;一.HTML结构&#x1f352;1.1认识HTML标签&#x1f352;1.2HTML文件基本结构&#x1f352;1.3标签层次结构&#x1f352;1.4快速生成代码框架&#x1f34e;二.HTML常见标签&#x1f352;1.1注释标签&#x1f352;1.2标题标签&#xff08;h1-h6&…

用ADSelfService Plus更新Windows缓存的凭证

研究显示&#xff0c;帮助台技术员收到的所有电话中高达30%是因为遗忘了密码。当帮助台技术员处理大量此类电话时&#xff0c;对于来自远程的用户请求就无能为力了。这些用户使用本地缓存的Active Directory凭证来登录其机器。当该用户离开办公室时&#xff0c;帮助台技术员无法…

京东云开发者|ElasticSearch降本增效常见的方法

Elasticsearch在db_ranking 的排名又&#xff08;双叒叕&#xff09;上升了一位,如图1-1所示;由此可见es在存储领域已经蔚然成风且占有非常重要的地位。 随着Elasticsearch越来越受欢迎&#xff0c;企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢&#xff1f;今天…

某大厂软件测试岗一面笔试题+二面问答题面试经验分享

目录 某大软件测试厂笔试题 选择题 二面 某大软件测试厂笔试题 判断题(Y对&#xff0c;N错) 1.软件测试的目的是尽可能多的找出软件的缺陷。(Y) 2.Beta测试是验收测试的一种。(Y) 3.验收测试是由最终用户来实施的。(N) 4.项目立项前测试人员不需要提交任何工件。(Y) 5…

20 | 如何处理normal.mod not found

目录1 现象2 解决思路2.1 通过命令修复2.2 通过工具修复2.3 通过快照还原3 实际操作3.1 通过命令修复3.1.1 ls3.1.2 ls (hd0,X)/3.1.3 执行命令3.1.4 其他命令3.2 通过工具修复3.2.1 通过liveCD模式3.2.2 安装Boot-Repair3.2.3 修复3.3 通过快照还原1 现象 提示&#xff1a;ER…

YOLO9000: Better, Faster, Stronger (Yolov2)论文详细解读

目录前言1. Better&#xff08;更准&#xff09;2. Faster&#xff08;更快&#xff09;3. Stronger&#xff08;更壮&#xff09;前言 对应YOLOv1论文解读&#xff1a;You Only Look Once: Unified, Real-Time Object Detection&#xff08;Yolov1&#xff09; 论文详细解读 …

带你着手「Servlet」

⭐️前言⭐️ 有了前边文章为我们奠定下的网络基础&#xff0c;我们就可以开始学习Servlet的知识了&#xff0c;在部署一个Java的Servlet程序时&#xff0c;必须要有的开发工具是Tomcat,需要自行完成Tomcat的配置&#xff0c;并掌握maven仓库的配置方法&#xff0c;下边我们也…

windows下搭建mindspore的编译环境

rugwindows 10下安装mindpsore环境&#xff0c;需要visual studio 2019及以上&#xff0c;cmake, python 也可以从上面下载mindspore编译依赖的软件。 visual studioan安装时需注意 然后再安装cmake,git&#xff0c;安装好之后设置检查环境变量&#xff0c;缺失的要补上 系统…

WEB静态网页设计与制作——我的美丽家乡邢台

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

【数据结构】顺序表OJ

文章目录0. 前言1. 移除元素2. 删除有序数组中的重复项3. 合并两个有序数组4. 结语0. 前言 在上篇博客中&#xff0c;我们使用C语言实现了顺序表。其中我们也对顺序表的接口进行了完整的实现。但是光实现不够&#xff0c;还是需要题目来练习。于是今天我就为大家带来顺序表的三…

【雷达仿真 | FMCW TDMA-MIMO毫米波雷达信号处理仿真(可修改为DDMA-MIMO)】

本文编辑&#xff1a;调皮哥的小助理 本文引用了CSDN雷达博主XXXiaojie的文章源码&#xff08;https://blog.csdn.net/Xiao_Jie1&#xff09;&#xff0c;加以修改和注释&#xff0c;全面地、详细地阐述了FMCW TDM-MIMO毫米波雷达的工作原理&#xff0c;同时配套MATLA仿真实现方…

kubernetes

目录 一、容器云发展及主要内容 1、云平台计算,交付标准&#xff08;iaas-----openstack&#xff09; 2、平台即服务(PAAS&#xff09; 3.软件及服务(SAAS) 特点 二、内容 三、kubernetes集群架构与组件 基本组件 (1)Pod&#xff08;最小的资源单位&#xff09; (2)初…

信息系统综合测试与管理__软件测试

一 概念 软件测试是使用人工或者自动手机来运行或测试某个系统的过程&#xff0c; 目的是检测是否满足需求或者比较预期与实际的差别。 软件测试应该覆盖整个开发、维护过程&#xff0c; 不仅仅是编码阶段完成之后进行的一项活动。 常考的软件测试工具为LoadRunner, 是一种…

RHCE——分区、创建逻辑卷

1.创建一个逻辑卷 请按下列要求创建一个新的逻辑卷&#xff1a; 创建一个名为 datastore 的卷组&#xff0c;卷组的大小为4G 逻辑卷的名字为 database ,所属卷组为 datastore,该逻辑卷大小为3G 将新建的逻辑卷格式化为 xfs 文件系统&#xff0c; 2.通过自动挂载将该逻辑卷到/v…

机器学习笔记 十五:随机森林(Random Forest)评估机器学习模型的特征重要性

随机森林1. 随机森林介绍1.1 租赁数据案例2. 特征相关性分析&#xff08;热图&#xff09;2.1 热图绘制2.2 构建随机森林模型2.3 不同特征合并的重要性2.3.1 经纬度合并&#xff08;分3类&#xff09;2.3.2 经纬度合并&#xff08;分2类&#xff09;2.3.3 经纬度合并&#xff0…

HTML CSS游戏官网网页模板 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载 游戏娱乐网页成品代码...

✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f947; 关于作者: 历任研发工程师&#xff0c;技术组长&#xff0c;教学总监。 十载寒冰&#xff0c;难凉热血&#xff1b;多年过去&#xff0c;历经变迁&#xff0c;物是人非。 然而&#xff0c;对于技术的探索…

系分 - 系统规划

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 系分 - 系统规划 考点摘要 系统规划的步骤&#xff08;★&#xff09;可行性分析&#xff08;★★★&#xff09;成本效益分析&#xff08;★★★&#xff09; 系统规划的步骤 初步调查根据企业战略目标&#…

一行行的代码解密马尔可夫链

使用Python的马尔科夫链实例的实践 一行行的代码解密马尔可夫链。 当我开始学习物理时&#xff0c;我并不喜欢概率的概念。我对用物理学可以对整个世界进行建模的想法非常振奋&#xff0c;不确定性的想法让我很生气:) 事实是&#xff0c;当我们想研究真实的现象时&#xff0c;我…

硬件电路(3)设计篇----为什么栅极型推挽电路不用上P下N?

在做信号控制以及驱动时&#xff0c;为了加快控制速度&#xff0c;经常要使用推挽电路。推挽电路可以由两种结构组成&#xff1a;分别是上P下N&#xff0c;以及上N下P。其原理图如下所示&#xff0c; 在平时中&#xff0c;我个人经常遇到的推挽电路是第一种。当我每次问身边的…

推荐一个不到2MB的C#开发工具箱,集成了上千个常用操作类

今天给大家推荐一个C#开发工具箱&#xff0c;涵盖了所有常用操作类&#xff0c;体积小、功能强大。 项目简介 C# 开发工具箱。大都是静态类&#xff0c;加密解密&#xff0c;反射操作&#xff0c;权重随机筛选算法&#xff0c;分布式短id&#xff0c;表达式树&#xff0c;lin…