字体文件
如果想直接用系统的字体,在UI文件中拖一个Font Combo Box,QFontComboBox显示的字体可以设置,如果觉得系统的字体太多,想自己定义字体,就得找一些字体文件,LZ用的是win7在C:\Windows\Fonts下面可以找到一些字体文件,自己挑一些用的着的复制出来
主要思路
系统提供的QFontComboBox提供的字体太多,并且不能提供删除和增加,可扩展性不太好,本人写了一个,可以加载外部字体,并且可以删除字体文件,有一个需要注意的地方是,程序如果加载了字体文件,这个字体文件就不能删除,我的做法是这样的,用户选择删除字体文件时,字体文件列表框和字体下拉框这个选项没有被删除,这个被删除的字体文件名被写进一个文件,等下一次加载程序的时候,把上一次要删除的字体文件删除,字体下拉款的大小重新进行了设置,保证了用户能看到完整的字体名字,但是下拉框里面显示的字体名字都是英文的,如果想变成中文就得用一个map映射,中文和英文的字体,这里提供一个映射表
https://wenku.baidu.com/view/598e5aec19e8b8f67c1cb915.html
上传完才发现这有2句路径写错了,这2句写和不写都行,加上如果里面写的文件名被删除,不会被第二次删除
if (file.exists()) {
//../TestFont/deletefile.txt应该是这个路径
QFile::remove("../TestFont/fonts/deletefile.txt");
}
源码下载
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDir>
#include <QFontComboBox>
#include <QTimer>
#include <QMap>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void loadFontFile();
QDir *fontDir;
QTimer *timer;
//存储QListWidget中文件的名字和字体名字的映射
QMap<QString,QString> map1;
//存储字体名字和下拉框位置的映射
QMap<QString,int> map2;
private slots:
//加载字体
void on_loadFontBtn_clicked();
//删除字体
void on_deleteFontBtn_clicked();
//刷新列表
void setFontComboBox();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h">
#include <QDebug>
#include <QListWidgetItem>
#include <QFile>
#include <QFileDialog>
#include <QFontDatabase>
#include <QTextStream>
#include <QMap>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
fontDir = new QDir("../TestFont/fonts/");
ui->comboBox->view()->setFixedWidth(150);
//记录上次删除字体的文件
QFile file("../TestFont/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()));
loadFontFile();
setFontComboBox();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::loadFontFile()
{
//加QDir::Files是不让显示.和..
QStringList fileList = fontDir->entryList(QDir::Files);
qDebug() << fileList.length();
ui->listWidget->addItems(fileList);
}
void MainWindow::on_loadFontBtn_clicked()
{
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 = "../TestFont/fonts/" + fileName;
qDebug() << newFileUrl;
QFile::copy(fileUrl,newFileUrl);
ui->listWidget->addItem(fileName);
timer->start(1000);
}
void MainWindow::on_deleteFontBtn_clicked()
{
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 = "../TestFont/fonts/" + item->text();
QFile file("../TestFont/deletefile.txt");
if (file.open(QIODevice::WriteOnly)) {
QTextStream in(&file);
in << fileUrl;
}
file.close();
delete item;
}
}
void MainWindow::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 = "../TestFont/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++;
}
}
}