Qt程序加载外部字体

来源:互联网 发布:档案数据异地备份制度 编辑:程序博客网 时间:2024/06/06 03:30

字体文件

如果想直接用系统的字体,在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");}

源码下载

http://download.csdn.net/detail/zzti_erlie/9763748

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_OBJECTpublic:    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++;        }    }}
0 0
原创粉丝点击