Qt程序加载外部字体

17 篇文章 1 订阅

字体文件

如果想直接用系统的字体,在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_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++;
        }
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java识堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值