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
- Qt程序加载外部字体
- qt加载字体
- QT-字体文件加载
- 应用程序加载外部字体文件
- Qt5加载、使用外部字体
- QT 调用外部程序
- Qt启动外部程序
- Qt-调用外部程序
- QT 调用外部程序
- QT:关闭外部程序
- QT:打开外部程序
- Qt调用外部程序
- QT调用外部程序
- Qt打开外部程序
- 微信小程序引用外部字体
- QT程序字体小
- Flash笔记之加载外部字体
- QT下调用外部程序
- Rancher Labs和EVRY结为战略合作伙伴,加速DevOps在北欧市场的应用
- 三维BFS POJ
- 802 协议集
- 基于朴素贝叶斯判断垃圾短信
- 如何更加深入的了解网站用户行为
- Qt程序加载外部字体
- C++Notes04_类及其函数
- Effective STL-尽量使用区间操作代替单元素操作
- CentOS6.5x64使用Samba架设公共盘-匿名访问
- Ubuntu系统清理瘦身
- ionic开发——自定义等待动画$ionicLoading
- Activity管理类,用于Activity管理和退出
- Web系统大规模并发——电商秒杀与抢购
- Vue- v-html指令