Qt程序加载外部字体

网友投稿 308 2022-09-06

Qt程序加载外部字体

字体文件

如果想直接用系统的字体,在UI文件中拖一个Font Combo Box,QFontComboBox显示的字体可以设置,如果觉得系统的字体太多,想自己定义字体,就得找一些字体文件,LZ用的是win7在C:\Windows\Fonts下面可以找到一些字体文件,自己挑一些用的着的复制出来

主要思路

系统提供的QFontComboBox提供的字体太多,并且不能提供删除和增加,可扩展性不太好,本人写了一个,可以加载外部字体,并且可以删除字体文件,有一个需要注意的地方是,程序如果加载了字体文件,这个字体文件就不能删除,我的做法是这样的,用户选择删除字体文件时,字体文件列表框和字体下拉框这个选项没有被删除,这个被删除的字体文件名被写进一个文件,等下一次加载程序的时候,把上一次要删除的字体文件删除,字体下拉款的大小重新进行了设置,保证了用户能看到完整的字体名字,但是下拉框里面显示的字体名字都是英文的,如果想变成中文就得用一个map映射,中文和英文的字体,这里提供一个映射表

​​(file.exists()) { //../TestFont/deletefile.txt应该是这个路径 QFile::remove("../TestFont/fonts/deletefile.txt");}

源码下载

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include #include #include #include namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void loadFontFile(); QDir *fontDir; QTimer *timer; //存储QListWidget中文件的名字和字体名字的映射 QMap map1; //存储字体名字和下拉框位置的映射 QMap 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 #include #include #include #include #include #include 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::iterator i = map1.find(fileName); QString fontName = i.value(); QMap::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++; } }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:代理模式的应用
下一篇:广告情报局:蚂蚁新品牌广告:相信相信的力量!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~