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();
}
这样就为系统设置好了默认字体。
五、未解决的问题
思源字体也确实好看,但是利用上面方法添加字体库之后,有些界面不生效,想请教各位网友如何解决,可以在评论区讨论