Qt总结之二十:加载字体库
一、字体文件
如果想直接用系统的字体,在UI文件中拖一个Font Combo Box,QFontComboBox显示的字体可以设置,如果觉得系统的字体太多,想自己定义字体,就得找一些字体文件,我这里用的是win10在C:\Windows\Fonts下面可以找到一些字体文件,自己挑一些用的着的复制出来
二、设计方式
系统提供的QFontComboBox提供的字体太多,并且不能提供删除和增加,可扩展性不太好,本人写了一个,可以加载外部字体,并且可以删除字体文件,有一个需要注意的地方是,程序如果加载了字体文件,这个字体文件就不能删除,我的做法是这样的,用户选择删除字体文件时,字体文件列表框和字体下拉框这个选项没有被删除,这个被删除的字体文件名被写进一个文件,等下一次加载程序的时候,把上一次要删除的字体文件删除,字体下拉款的大小重新进行了设置,保证了用户能看到完整的字体名字,但是下拉框里面显示的字体名字都是英文的,如果想变成中文就得用一个map映射,中文和英文的字体,这里提供一个映射表
https://wenku.baidu.com/view/598e5aec19e8b8f67c1cb915.html
三、code block
#include "fontlist.h"
#include <QDebug>
#include <QListWidgetItem>
#include <QFile>
#include <QFileDialog>
#include <QFontDatabase>
#include <QTextStream>
#include <QMap>
fontList::fontList(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
fontDir = new QDir("./Resources/fonts/");
ui.comboBox->view()->setFixedWidth(560);
//记录上次删除字体的文件
QFile file("./Resources/deletefile.txt");
if (file.open(QIODevice::ReadOnly)) {
QTextStream out(&file);
QString fileUrl = out.readLine();
//删除字体文件
QFile::remove(fileUrl);
}
timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(setFontComboBox()));
connect(ui.loadFont, SIGNAL(clicked()), this, SLOT(slotLoadFont()));
connect(ui.delFont, SIGNAL(clicked()), this, SLOT(slotDelFont()));
loadFontFile();
setFontComboBox();
}
fontList::~fontList()
{
}
void fontList::loadFontFile()
{
//加QDir::Files是不让显示
QStringList fileList = fontDir->entryList(QDir::Files);
qDebug() << fileList.length();
ui.listWidget->addItems(fileList);
}
void fontList::slotLoadFont()
{
QString fileUrl = QFileDialog::getOpenFileName(this, "open file", "", "TTF File(*.ttf)");
if (fileUrl.isEmpty())
return;
int index = fileUrl.lastIndexOf("/");
//从url中截取文件名字
QString fileName = fileUrl.mid(index + 1);
QString newFileUrl = "./Resources/fonts/" + fileName;
qDebug() << newFileUrl;
QFile::copy(fileUrl, newFileUrl);
ui.listWidget->addItem(fileName);
timer->start(1000);
}
void fontList::slotDelFont()
{
QListWidgetItem *item = ui.listWidget->currentItem();
if (item != NULL) {
QString fileName = item->text();
QMap<QString, QString>::iterator i = map1.find(fileName);
QString fontName = i.value();
QMap<QString, int>::iterator i2 = map2.find(fontName);
int index = i2.value();
ui.comboBox->removeItem(index);
QString fileUrl = "./Resources/fonts/" + item->text();
QFile file("./Resources/deletefile.txt");
if (file.open(QIODevice::WriteOnly)) {
QTextStream in(&file);
in << fileUrl;
}
file.close();
delete item;
}
}
void fontList::setFontComboBox()
{
timer->stop();
ui.comboBox->clear();
int index = 0;
QStringList fileList = fontDir->entryList(QDir::Files | QDir::Readable);
qDebug() << fileList.length();
foreach(QString fileName, fileList) {
QString fileUrl = "./Resources/fonts/" + fileName;
int fontId = QFontDatabase::addApplicationFont(fileUrl);
QStringList fontFamilies = QFontDatabase::applicationFontFamilies(fontId);
if (!fontFamilies.empty()) {
QString fontName = fontFamilies.at(0);
ui.comboBox->addItem(fontName);
map1[fileName] = fontName;
map2[fontName] = index;
index++;
}
}
}