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

          对font的解释如下:a specific size and style of type within a type family。

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应用程序中设置字体的更多相关文章

  1. 分享我用Qt开发的应用程序【二】在Qt应用程序中使用字体图标fontawesome

    为了使用简单,需要先写一个单件类,头文件的代码如下: 其中静态方法Instance保证IconHelper的实例全局唯一 (注意构造函数已经私有化了) #ifndefICONHELPER_H #def ...

  2. 报表控件NCReport教程:集成NCReport到Qt应用程序中

    NCReport是一款轻量级.快速.多平台.简单易用的基于Qt toolkit的C++编写的报表解决方案,目前主要包括报表渲染库和报表设计器GUI应用程序. 但是好多使用NCReport控件的朋友都不 ...

  3. 如何在微信小程序中使用字体图标

    微信小程序中,在image标签里,可以在src中引用本地文件,但是background设置背景图或者使用字体图标的时候,却不能引用本地文件,只能用url地址的图片或字体,或者使用base64编码后的格 ...

  4. Qt应用程序图标设置

    Qt应用程序图标设置 本文仅仅适用于windows下,linux等不适用. 下面说的图标,指的是程序文件的图标,而不是托盘图标或者说运行时任务栏的图标(任务栏和程序窗口的图标在windows/linu ...

  5. XCode中设置字体大小

    XCode中设置字体大小 1)打开Preferences,快捷键是“Command + ,”(注意,是三个键,按住command键,然后再快速地按“+”和“,”两个键即可) 2)选择“Fonts &a ...

  6. 中小研发团队架构实践之生产环境诊断工具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如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  7. ZT Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性

    Android布局]在程序中设置android:gravity 和 android:layout_Gravity属性 分类: [Android基础] 2011-04-19 16:06 54739人阅读 ...

  8. Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果

    Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...

  9. 【Qt开发】关于Qt应用程序中的堆栈、静态存储区的使用错误

    [Qt开发]关于Qt应用程序中的堆栈.静态存储区的使用错误 标签:[Qt开发] 最近终于又碰到了这个问题,想在main函数中定义一个局部大的数组,结果运行就报错,尼玛!刚开始真的不知道到发生了什么,后 ...

随机推荐

  1. bzoj1913[Apio2010]signaling 信号覆盖 计算几何

    1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1583  Solved: 646[Subm ...

  2. bzoj1493[NOI2007]项链工厂 线段树

    1493: [NOI2007]项链工厂 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1712  Solved: 723[Submit][Status] ...

  3. 缓冲区(buffer)与缓存(cache)

    下面介绍缓冲区的知识. 一.什么是缓冲区 缓冲区(buffer),它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区, ...

  4. Windows 2008 R2_NLB网络负载均衡(图文详解)(转)

    目录 前言 软件环境 DNS域名服务器 DNS服务器原理 DNS域名空间 DNS区域 DNS服务器的类别 DNS查询模式 缓存文件 配置DNS服务器 DNS服务的应用 新建子域 在DNS正向解析中新建 ...

  5. JavaScript判断不同平台

    function getPlatformType() { let UA = navigator.userAgent; if(/MicroMessenger/i.test(UA)){ return 'w ...

  6. 首届.NET Core开源峰会

    首届.NET Core开源峰会 代号:dnc 2018 亮点:去中心化.社区驱动 开源峰会 时间:2018年5月20日 周日 地点:在线峰会.远程参与 形式:每个主题5分钟-15分钟闪电演讲 演讲方式 ...

  7. go优化

    1.安装graphviz软件,安装步骤如下::(1)安装graphvizyum install 'graphviz*' (2)查看已安装graphviz包yum list 'graphviz*' 2. ...

  8. android 小项目------黑名单app

    周一的时候,同事在群里问到了黑名单功能,他说网上都没有找到一个完整的,记得谁说过一句,当都没有做过的时候,这就是机会.这几天公司事比较多,只能晚上抽时间写写,直到今天才完整的做出来. 具体效果的话大家 ...

  9. Python 2.7 闭包的局限

    想法源自:http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to- ...

  10. 阿里云服务器云数据库免费体验(Java Web详细实例)

    一.效果展示 博主部署了两个war包到阿里云服务器上,一个是没有连接数据库的,另外一个是连接了数据库的. (由于阿里云服务器免费使用15天,下面链接约2016年3月9日后无效) (1)无数据库版访问地 ...