博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt应用程序中设置字体
阅读量:5008 次
发布时间:2019-06-12

本文共 6710 字,大约阅读时间需要 22 分钟。

                                       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 
#include
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());}
执行效果:

转载于:https://www.cnblogs.com/brucemengbm/p/7251188.html

你可能感兴趣的文章
字符串空格的压缩
查看>>
socket 实现单一串口共享读写操作
查看>>
tableView优化方案
查看>>
近期思考(2019.07.20)
查看>>
Apache2.4使用require指令进行访问控制
查看>>
冗余关系_并查集
查看>>
做最好的自己(Be Your Personal Best)
查看>>
如何搭建github+hexo博客-转
查看>>
HW2.2
查看>>
将Windows Server 2016 打造成工作站(20161030更新)
查看>>
5大主浏览器css3和html5兼容性大比拼
查看>>
常用正则表达示
查看>>
解决Oracle在命令行下无法使用del等键问题
查看>>
获取web项目的绝对路径的方法总结
查看>>
nodejs批量处理图片
查看>>
c# 复制整个文件夹的内容,Copy所有文件
查看>>
30秒js练习(数组篇) 更新中。。。
查看>>
hdu-5894 hannnnah_j’s Biological Test(组合数学)
查看>>
hdu-4810 Wall Painting(组合数学)
查看>>
企业互联网服务介绍
查看>>