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++;
		}
	}
}


 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值