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

对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应用程序中设置字体

时间: 2024-10-13 17:35:30

Qt应用程序中设置字体的相关文章

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

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

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

微信小程序中,在image标签里,可以在src中引用本地文件,但是background设置背景图或者使用字体图标的时候,却不能引用本地文件,只能用url地址的图片或字体,或者使用base64编码后的格式,图片我们可以在线转换,随便搜一下,有很多在线转换工具,但是使用字体图标的时候,怎么转换呢?下面我们记录一下使用图标字体的l两个方法.    方法一:将字体url转换为base64的格式后使用 第一步,下载需要的字体图: 打开阿里巴巴矢量图标库,选择自己需要的图标添加到购物车,然后点击购物车下载代

XCode中设置字体大小

XCode中设置字体大小 1)打开Preferences,快捷键是“Command + ,”(注意,是三个键,按住command键,然后再快速地按“+”和“,”两个键即可) 2)选择“Fonts & Colors”,选中所有的“Category”,然后双击“Font”一列,在弹出的对话框中选择适合自己的字体大小即可.

关于QFont类中设置字体的一些函数

1 setFamily() 设置字体类型 如宋体 楷体微软雅黑 Consolas 等 2 setStyleName() "Normal" 正常 "Bold" 加粗 "Italic" 斜体 "Bold Italic" 加粗斜体 这个函数的设置还有待验证 3 setPointSize() 设置点大小 4 setPixelSize() 设置像素大小 5 setWeight() 设置粗细 6 setBold(bool) 设置加粗 7

在Winform程序中设置管理员权限及为用户组添加写入权限

在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身份运行,或者设置Users用户组在运行目录中具有写入权限都可以解决问题,不过如果我们想通过C#代码进行自动的处理,那么应该如何实现呢? 1.系统设置管理员权限或者目录写入权限 如果我们需要让程序以管理员身份运行,那么可以通过设置快捷方式的属性或者应用程序的属性为[以管理员身份运行此程序]即可实现,如

(转)在Winform程序中设置管理员权限及为用户组添加写入权限

本文转载自:http://www.cnblogs.com/wuhuacong/p/5645172.html 在我们一些Winform程序中,往往需要具有一些特殊的权限才能操作系统文件,我们可以设置运行程序具有管理员权限或者设置运行程序的目录具有写入的权限,如果是在操作系统里面,我们可以设置运行程序以管理员身份运行,或者设置Users用户组在运行目录中具有写入权限都可以解决问题,不过如果我们想通过C#代码进行自动的处理,那么应该如何实现呢? 1.系统设置管理员权限或者目录写入权限 如果我们需要让程

C#程序中设置全局代理(Global Proxy)

1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1 //设置代理 2 WebProxy WP = new WebProxy("41.76.44.76", 3128); 3 ICredentials jxCredt = new NetworkCredential("proxy_username", "proxy_password"); 4 WP.Credentials = jxCredt; 5 6 H

css中设置字体样式

font-family: SimHei,"微软雅黑",sans-serif; 注意:加上中文名"微软雅黑"是为了兼容opera浏览器,中文字体名必须加上引号(单引号双引号都可以). 常见中文字体的英文名: 华文细黑:STHeiti Light [STXihei] 华文黑体:STHeiti 华文楷体:STKaiti 华文宋体:STSong 华文仿宋:STFangsong 儷黑 Pro:LiHei Pro Medium 儷宋 Pro:LiSong Pro Light 標

[Z] C#程序中设置全局代理(Global Proxy)

https://www.cnblogs.com/Javi/p/7274268.html 1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1             //设置代理 2         WebProxy WP = new WebProxy("41.76.44.76", 3128); 3             ICredentials jxCredt = new NetworkCredential("proxy_us