Qt应用程序中设置字体
Qt应用程序中设置字体
应用程序中经常需要设置字体,例如office软件或者是其他的编辑器软件等等。这里主要涉及到如下几个概念:字体,字号以及风格(例如:粗体,斜体,下划线等等)。Qt里面也有对应的类。接下来我们主要对这几个类进行详细的说明,最后举例说明它们的应用。
1、Qt中相关的类:QFontDatabase、QFont、QFontInfo和QFontMetrics、QFontMetricsF;
(1)QFontDatabase
QFontDatabase类提供了底层窗口系统所提供的系统可用的字体。
该类最常见的用法就是调用接口查询数据库,获取系统支持的字体,以及每种字体支持的大小和风格。smoothSizes()类似pointSizes(),但是前者返回的是在某种字体(family)下某种风格(style)支持的最好的字号。
font()函数返回指定的字体,风格和字号的QFont。
QFontDatabase也支持一些静态函数,例如:standardSizes()。可以使用writingSystemName()获取对应writingSystem的字符串描述。
代码片段:
QFontDatabase database;
QTreeWidget fontTree;
fontTree.setColumnCount(2);
fontTree.setHeaderLabels(QStringList() << "Font" << "Smooth Sizes"); foreach (const QString &family, database.families()) {
QTreeWidgetItem *familyItem = new QTreeWidgetItem(&fontTree);
familyItem->setText(0, family); foreach (const QString &style, database.styles(family)) {
QTreeWidgetItem *styleItem = new QTreeWidgetItem(familyItem);
styleItem->setText(0, style); QString sizes;
foreach (int points, database.smoothSizes(family, style))
sizes += QString::number(points) + " "; styleItem->setText(1, sizes.trimmed());
}
}
(2)QFont和QFontInfo
QFont类用于创建绘制文本的字体。当创建QFont对象的时候,可以指定一系列的属性。Qt将会使用指定的属性,但是如果没有这些属性,Qt就会选择与指定的最相近的属性来代替。我们可以使用QFontInfo对象获取实际使用的font属性。
如果窗口系统提供准确的exactMatch,也就是exactMatch()函数返回true,那么就可以使用QFontMetrics类获取实际数据,例如:QFontMetrics::width()函数返回字符的像素的宽度。
在使用QFont之前必须先指定QGuiApplication的实例,我们可以使用QGuiApplication::setFont()设置应用的默认font。
如果选择了一个字体,但是该字体不包括所有需要显示的字符,QFont就会寻找最近的font的字符。
我们可以像下面这样创建font:
QFont serifFont("Times", 10, QFont::Bold);
QFont sansFont("Helvetica [Cronyx]", 12);
在构造函数中指定的属性也可以稍后通过成员函数设置。QFontInfo必须在font所有属性都设置之后再创建。QFontInfo用于获取QFont的信息,但是QFontInfo不会更新,哪怕对应的QFont使用的属性发生了改变,QFontInfo也不会得到更新,通过QFontInfo获取的信息依然是最初设置的。
如果请求的QFont不可用,你可以调用setStyleHint()来改变font matching algorithm,可以通过调用defaultFamily()获取默认的family。
每一个QFont都有一个key可以使用,类似字典中的key一样,如果你想存储用户的font偏好设置,那么你可以使用QSettings,可以使用toString()写入,使用fromString()读出,操作符“《《”和“》》”依旧可以使用,但是这两个操作符用于数据流。
我们可以通过setPixelSize()设置字符显示的高度,但是setPointSize()可以达到类似的效果而且是设备无关的。
在X11系统下,我们可以使用setRawName()来设置font。加载font将会会是十分昂贵的,特别在X11上。
font matching algorithm工作流程如下:
*)搜索指定的font family;
*)如果上一步没有找到,就使用styleHint()选择一个替代的字体;
*)搜索上面找到的替代的字体;
*)上面的搜索都没有找到或者是没有styleHint(),那么就使用“helvetica”进行搜索;
*)如果“helvetica”没有找到,那么Qt就会使用lastResortFamily();
*)如果lastResortFamily()没有搜索到,那么使用lastResortFont(),该调用总是会返回一个可用的。
当family匹配之后就会再匹配属性,属性的匹配顺序如下:
*)fixedPitch()
*)pointSize() (see below)
*)weight()
*)style()
优先匹配family,再匹配属性。
To find out font metrics use a QFontMetrics object, e.g.
QFontMetrics fm(f1);
int textWidthInPixels = fm.width("How many pixels wide is this text?");
int textHeightInPixels = fm.height();
(3)QFontMetrics和QFontMetricsF
这两个类用于获取字体的像素信息,例如字体的高度,一个给定字符串的像素宽度等等。
2、举例:下面是对上面几个类的使用示例:
#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QFontDatabase>
#include <QDebug> struct tagWritingSystem
{
QString WritingSystemName;
int enWritingSystemId;
}; tagWritingSystem WritingSystemArry[] = {
{"Latin", 1},
{"Greek", 2},
{"Cyrillic", 3},
{"Armenian", 4},
{"Hebrew", 5},
{"Arabic", 6},
{"Syriac", 7},
{"Thaana", 8},
{"Devanagari", 9},
{"Bengali", 10},
{"Gurmukhi", 11},
{"Gujarati", 12},
{"Oriya", 13},
{"Tamil", 14},
{"Telugu", 15},
}; MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); QFontDatabase db;
/* First display all the Writing System */
for(int index = 0; index < db.writingSystems().length(); index++)
{
;
}
for(int index = 0; index < 15; index++)
{
ui->comboBox->addItem(WritingSystemArry[index].WritingSystemName);
} int currIndex = 0;
for(int index = 0; index < 15; index++)
{
if (ui->comboBox->currentText() == WritingSystemArry[index].WritingSystemName)
{
currIndex = index;
break;
}
} /* Filter the Family by Writing System */
ui->FamilyCb->addItems(db.families((QFontDatabase::WritingSystem)currIndex)); /* Filter the Style by Family */
ui->StyleCb->addItems(db.styles(ui->FamilyCb->currentText())); /* Insert the Size */
foreach (int var, db.standardSizes()) {
ui->SizeCb->addItem(QString::number(var));
} /* Font:a specific size and style of type within a type family */
QFont font = db.font(ui->FamilyCb->currentText(), ui->StyleCb->currentText(), ui->SizeCb->currentText().toInt());
qDebug() << font.family() << ":" << font.styleName(); /* set the font */
//QGuiApplication::setFont(font);
ui->FontLabel->setFont(font); ui->FontLabel->setText(font.family() + ":" + font.styleName()); QFontInfo fontinfo = this->fontInfo();
qDebug() << fontinfo.family() + ":" + fontinfo.styleName();
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::on_comboBox_currentTextChanged(const QString &arg1)
{
QFontDatabase db; qDebug() << arg1;
qDebug() << ui->comboBox->currentText(); int currIndex = 0;
for(int index = 0; index < 15; index++)
{
if (ui->comboBox->currentText() == WritingSystemArry[index].WritingSystemName)
{
currIndex = index;
break;
}
} qDebug() << currIndex; ui->FamilyCb->addItems(db.families((QFontDatabase::WritingSystem)currIndex));
} void MainWindow::on_FamilyCb_currentTextChanged(const QString &arg1)
{
QFontDatabase db; qDebug() << arg1;
ui->StyleCb->addItems(db.styles(ui->FamilyCb->currentText()));
} void MainWindow::on_StyleCb_currentTextChanged(const QString &arg1)
{
QFontDatabase db; qDebug() << arg1; /* Font:a specific size and style of type within a type family */
QFont font = db.font(ui->FamilyCb->currentText(), ui->StyleCb->currentText(), ui->SizeCb->currentText().toInt());
qDebug() << font.family() << ":" << font.styleName(); /* set the font */
font.setBold(true);
font.setUnderline(true);
ui->FontLabel->setFont(font); ui->FontLabel->setText(font.family() + ":" + font.styleName());
} void MainWindow::on_SizeCb_currentTextChanged(const QString &arg1)
{
QFontDatabase db; qDebug() << arg1; /* Font:a specific size and style of type within a type family */
QFont font = db.font(ui->FamilyCb->currentText(), ui->StyleCb->currentText(), ui->SizeCb->currentText().toInt());
qDebug() << font.family() << ":" << font.styleName(); /* set the font */
font.setBold(true);
font.setUnderline(true);
ui->FontLabel->setFont(font); ui->FontLabel->setText(font.family() + ":" + font.styleName());
}
运行效果:
Qt应用程序中设置字体的更多相关文章
- 分享我用Qt开发的应用程序【二】在Qt应用程序中使用字体图标fontawesome
为了使用简单,需要先写一个单件类,头文件的代码如下: 其中静态方法Instance保证IconHelper的实例全局唯一 (注意构造函数已经私有化了) #ifndefICONHELPER_H #def ...
- 报表控件NCReport教程:集成NCReport到Qt应用程序中
NCReport是一款轻量级.快速.多平台.简单易用的基于Qt toolkit的C++编写的报表解决方案,目前主要包括报表渲染库和报表设计器GUI应用程序. 但是好多使用NCReport控件的朋友都不 ...
- 如何在微信小程序中使用字体图标
微信小程序中,在image标签里,可以在src中引用本地文件,但是background设置背景图或者使用字体图标的时候,却不能引用本地文件,只能用url地址的图片或字体,或者使用base64编码后的格 ...
- Qt应用程序图标设置
Qt应用程序图标设置 本文仅仅适用于windows下,linux等不适用. 下面说的图标,指的是程序文件的图标,而不是托盘图标或者说运行时任务栏的图标(任务栏和程序窗口的图标在windows/linu ...
- XCode中设置字体大小
XCode中设置字体大小 1)打开Preferences,快捷键是“Command + ,”(注意,是三个键,按住command键,然后再快速地按“+”和“,”两个键即可) 2)选择“Fonts &a ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- ZT Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
Android布局]在程序中设置android:gravity 和 android:layout_Gravity属性 分类: [Android基础] 2011-04-19 16:06 54739人阅读 ...
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- 【Qt开发】关于Qt应用程序中的堆栈、静态存储区的使用错误
[Qt开发]关于Qt应用程序中的堆栈.静态存储区的使用错误 标签:[Qt开发] 最近终于又碰到了这个问题,想在main函数中定义一个局部大的数组,结果运行就报错,尼玛!刚开始真的不知道到发生了什么,后 ...
随机推荐
- [BZOJ]3672 购票(Noi2014)
革命尚未成功,同志还需努力. Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ ...
- 数据挖掘实战<1>:数据质量检查
数据行业有一句很经典的话--"垃圾进,垃圾出"(Garbage in, Garbage out, GIGO),意思就是,如果使用的基础数据有问题,那基于这些数据得到的任何产出都是没 ...
- js打印小结
<script type="text/javascript"> //打印必备参数 var hkey_root,hkey_path,hkey_key; hkey_root ...
- java集合之ArrayList源码解读
源自:jdk1.8.0_121 ArrayList继承自AbstractList,实现了List.RandomAccess.Cloneable.Serializable. ArrayList内部是通过 ...
- 一日一练-JS toString 和valueOf 方法的联系与区别
子曰:类型转换中toString 和valueOf 的联系与区别分析 首先是看看ES5 的规范是如何进行说明的 在这里有几个基础知识点需要了解一下: [[Class]] [[Class]] 属于Obj ...
- openwrt 下添加sim760ce usb驱动
SIM7500_SIM7600 系列模块的 USB VID 是 0x1E0E PID 是 0x9001. 作为 Slave USB 设备,配置如下表 USB 接口波特率自适应 9600.115200 ...
- 软件测试assert
之前实习做过一段时间测试,现做个总结: 实习测试的是一款CM系统(case 系统),来记录IT部门处理的维修,服务,反馈,预定服务等case:b/s架构,人少小项目,实习时间短,去了已经快完工,主要测 ...
- 3.2 2-dim Vector Initialization
声明3行4列的数组 const int m = 3, n = 4; vector<vector<int> > A(m); // 3 rows for(int i = 0; i ...
- MySQL 排序
MySQL 排序 我们知道从MySQL表中使用SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用MySQL的 ORDER BY 子句来设定你想按哪个字段哪中方式来 ...
- Unity使用UGUI进行VR游戏的界面开发
原文链接:http://gad.qq.com/article/detail/7181505 本文首发腾讯GAD开发者平台,未经允许,不得转载 我不知道有多少同学是跟我一样,在开发VR游戏中,是使用的面 ...