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]1045 糖果传递(HAOI2008)
放一道数学题. Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=1000000,表示 ...
- java9学习之模块化
截止到目前JDK的版本已经更新到10了,虽然java9的生命周期才半年,但是我认为这个版本带来的变革是不可磨灭的,它是第一次深层次的针对架构以及依赖上的革新.下面我们就来学习一下. 一.模块化项目构建 ...
- vrn:基于直接体积回归的单幅图像大姿态三维人脸重建
3D面部重建是一个非常困难的基本计算机视觉问题.目前的系统通常假设多个面部图像(有时来自同一主题)作为输入的可用性,并且必须解决许多方法学挑战,例如在大的面部姿势,表情和不均匀照明之间建立密集的对应. ...
- EffectiveTensorflow:Tensorflow 教程和最佳实践
Tensorflow和其他数字计算库(如numpy)之间最明显的区别在于Tensorflow中的操作是符号. 这是一个强大的概念,允许Tensorflow进行所有类型的事情(例如自动区分),这些命令式 ...
- git pull 报错 You have not concluded your merge (MERGE_HEAD exists).
git pull时报错 解决方案:
- 字符串的最长回文串:Manacher’s Algorithm
题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring ...
- laravel实现支付宝支付功能
起因 前段时间因为项目中需要实现支付宝手机网站支付功能,所以写下这篇文章以作记录,不足之处,欢迎指教. 后端框架:Laravel 5.5 业务功能 适用于商家在移动端网页应用中集成支付宝支付功能.商家 ...
- day04 Java Web 开发入门
day04 Java Web 开发入门 1. web 开发相关介绍 2. web 服务器 3. Tomcat服务器启动的问题 4. Tomcat目录结构 5. Web应用程序(虚拟目录映射,缺省web ...
- 继承自 DevExpress 17.2 的自定义控件如何在工具箱显示
最近把DevExpress版本从13.1升级到了17.2,结果发现继承自DevExpress的自定义控件居然在工具箱中消失了,弄了两天还是没有任何头绪,部分自定义Dev控件可以正常出现,但大部分自定义 ...
- Page Object设计模式实践
Page Object模式是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织. Page Object模式,创建一个对 ...