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函数中定义一个局部大的数组,结果运行就报错,尼玛!刚开始真的不知道到发生了什么,后 ...
随机推荐
- hdu4605 树状数组+离散化+dfs
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- BZOJ4589 Hard Nim(快速沃尔什变换模板)
终于抽出时间来学了学,比FFT不知道好写到哪里去. #include <cstdio> typedef long long ll; ,p=1e9+; int k,m,n,a[N],pi[N ...
- mysql免安装版下载及配置教程
第一步:下载 下载地址:http://dev.mysql.com/downloads/mysql/ 滚动到下方就能看到了,根据自己的需求下载: 我的电脑为64为的所以下载的为 Windows (x86 ...
- c# 复制dataset中table结构跟数据
DataTable dt = new DataTable(); dt = ds.Tables[0].Copy();
- struts2 可以用ognl拿到值而不可以用el拿到值的解决方法
错误debug后 得到了There is no read method for container的错误 于是我new了一个实体类 package com.unity; public class St ...
- Nginx配置二级目录/路径 映射不同的反向代理和规避IP+端口访问
当配置Nginx来映射不同的服务器 可以通过二级路径来反向代理 来解决一个外网端口实现多个服务访问. 配置如下: server { listen ; server_name demo.domai ...
- Node.js系列文章:利用console输出日志文件
通常我们在写Node.js程序时,都习惯使用console.log打印日志信息,但这也仅限于控制台输出,有时候我们需要将信息输出到日志文件中,实际上利用console也可以达到这个目的的,今天就来简单 ...
- .net通用CMS快速开发框架——问题1:Dapper通用的多表联合分页查询怎么破?
最近在弄一个东东,类似那种CMS的后台管理系统,方便作为其它项目的初始化框架用的. 现在遇到个问题,如标题所示:Dapper通用的多表联合分页查询怎么破? 难道只能通过拼接sql或者使用存储过程吗?我 ...
- iOS多线程编程--NSOperation(转)
这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github. ...
- JS中的DOM— —节点以及操作
DOM操作在JS中可以说是非常常见了吧,很多网页的小功能的实现,比如一些元素的增删操作等都可以用JS来实现.那么在DOM中我们需要知道些什么才能完成一些功能的实现呢?今天这篇文章就先简单的带大家入一下 ...