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. [BZOJ]1045 糖果传递(HAOI2008)

    放一道数学题. Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=1000000,表示 ...

  2. java9学习之模块化

    截止到目前JDK的版本已经更新到10了,虽然java9的生命周期才半年,但是我认为这个版本带来的变革是不可磨灭的,它是第一次深层次的针对架构以及依赖上的革新.下面我们就来学习一下. 一.模块化项目构建 ...

  3. vrn:基于直接体积回归的单幅图像大姿态三维人脸重建

    3D面部重建是一个非常困难的基本计算机视觉问题.目前的系统通常假设多个面部图像(有时来自同一主题)作为输入的可用性,并且必须解决许多方法学挑战,例如在大的面部姿势,表情和不均匀照明之间建立密集的对应. ...

  4. EffectiveTensorflow:Tensorflow 教程和最佳实践

    Tensorflow和其他数字计算库(如numpy)之间最明显的区别在于Tensorflow中的操作是符号. 这是一个强大的概念,允许Tensorflow进行所有类型的事情(例如自动区分),这些命令式 ...

  5. git pull 报错 You have not concluded your merge (MERGE_HEAD exists).

    git pull时报错 解决方案:

  6. 字符串的最长回文串:Manacher’s Algorithm

    题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring ...

  7. laravel实现支付宝支付功能

    起因 前段时间因为项目中需要实现支付宝手机网站支付功能,所以写下这篇文章以作记录,不足之处,欢迎指教. 后端框架:Laravel 5.5 业务功能 适用于商家在移动端网页应用中集成支付宝支付功能.商家 ...

  8. day04 Java Web 开发入门

    day04 Java Web 开发入门 1. web 开发相关介绍 2. web 服务器 3. Tomcat服务器启动的问题 4. Tomcat目录结构 5. Web应用程序(虚拟目录映射,缺省web ...

  9. 继承自 DevExpress 17.2 的自定义控件如何在工具箱显示

    最近把DevExpress版本从13.1升级到了17.2,结果发现继承自DevExpress的自定义控件居然在工具箱中消失了,弄了两天还是没有任何头绪,部分自定义Dev控件可以正常出现,但大部分自定义 ...

  10. Page Object设计模式实践

    Page Object模式是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织. Page Object模式,创建一个对 ...