外观和样式(09):【类】QFont[官翻]

QFont 类

QFont类指定了用于绘制文本的字体的查询。

Header:#include < QFont >
qmake:QT += gui

详述

QFont可以看作是对系统上一种或多种字体的查询。

当创建一个QFont对象时,需要指定各种你想要字体拥有的属性。Qt将使用带有指定属性的字体,如果不存在匹配字体,Qt将使用最接近已安装字体的字体。实际使用的字体属性可以从QFontInfo对象中检索。如果窗口系统提供了精确匹配,则exactMatch()返回true。使用QFontMetricsF 获取度量值,例如使用QFontMetrics::width()获取字符串的像素长度。

没有特别设置的属性将不会影响字体选择算法,这些属性会使用默认值。

要加载特定的物理字体(通常由单个文件表示),请使用QRawFont

注意,在使用QFont前,QGuiApplication实例必须存在。可以用QGuiApplication::setFont()设置应用程序的默认字体。

如果选择的字体不包含需要显示的所有字符,QFont将尝试在最接近的等效字体中查找字符。当一个QPainter从一个字体中绘制一个字符时,QFont将报告它是否具有该字符;如果没有,QPainter将绘制一个未填充的正方形。

像这样创建QFonts:

 QFont serifFont("Times", 10, QFont::Bold);
 QFont sansFont("Helvetica [Cronyx]", 12);

在构造函数中设置的属性也可以在以后设置,例如setFamily(), setPointSize(), setPointSizeF(), setWeight()和setItalic()。其余的属性必须在构造之后设置,例如setBold(), setUnderline(), setOverline(), setStrikeOut()和setFixedPitch()。QFontInfo对象应该在字体的属性设置之后创建。即使你改变了字体的属性,QFontInfo对象也不会改变。相应的“get”函数,例如family(), pointSize()等,返回设置的值,即使使用的值可能不同。实际的值可以从QFontInfo对象中获得。

如果所请求的字体族不可用,你可以通过setStyleHint()选择一个特定的QFont::StyleHint和QFont::StyleStrategy来影响字体匹配算法。defaultFamily()返回默认族(与当前样式提示相对应)。

可以使用insertSubstitution()和insertSubstitutions()为字体家族名称提供替换。替换可以用removeSubstitutions()来删除。使用substitute()检索家庭的第一个替代品,如果没有替代品,则检索家庭名本身。使用substitution()来检索一个家庭的替代品列表(可能是空的)。替换一种字体之后,必须通过销毁并重新创建所有QFont对象来触发字体的更新。

每个QFont都有一个key(),您可以使用它,例如,作为缓存或字典中的键。如果你想存储一个用户的字体偏好,你可以使用QSettings,用toString()写字体信息,然后用fromString()读回来。operator<<()和operator>>()函数也可用,但它们用于数据流。

可以用setPixelSize()将屏幕上显示的字符高度设置为指定的像素数;然而,使用setPointSize()有类似的效果,并提供设备独立性。

加载字体可能非常昂贵,特别是在X11上。QFont包含大量优化,使QFont对象的复制速度更快,并缓存它所依赖的慢速窗口系统函数的结果。

字体匹配算法的工作原理如下:

  • 搜索指定的字体族(由setFamilies()设置)。
  • 如果没有找到,那么如果设置了指定的字体族存在并且可以用来表示正在使用的书写系统,那么它将被选中。
  • 如果不是,则选择支持书写系统的替代字体。字体匹配算法将尝试为QFont中设置的所有属性找到最佳匹配。实现这一点的方法因平台而异。
  • 如果系统中不存在支持文本的字体,那么特殊的“缺失字符”框将显示在它的位置上。

注意:如果所选字体虽然支持一般的书写系统,但缺少一个或多个特定字符的字形,那么Qt将尝试为该字符或这些特定字符找到备用字体。这个特性可以使用QFont:: nofontmerge样式策略禁用。

在Windows中,对“Courier”字体的请求会自动更改为“Courier New”,这是Courier的改进版本,允许平滑缩放。旧的“Courier”位图字体可以通过设置PreferBitmap样式策略来选择( 参见setStyleStrategy() )。

一旦找到字体,其余的属性将按照优先级进行匹配:

  • fixedPitch ()
  • pointSize() (见下文)
  • weight()
  • style()

如果你有一个与family匹配的字体,即使其他属性都不匹配,这个字体将优先选择不与family匹配但与其他属性匹配的字体。这是因为字体家族是主要的搜索条件。

如果点大小在请求的点大小的20%以内,则定义点大小匹配。当多个字体匹配且仅以点大小区分时,将选择与请求的字体点大小最接近的字体。

用于绘制文本的实际字体族、字体大小、粗细和其他字体属性将取决于在窗口系统下所选的字体族可用的内容。QFontInfo对象可用于确定绘制文本所使用的实际值。

Examples:

QFont f("Helvetica");

如果你同时拥有Adobe和Cronyx Helvetica,你可能会得到任何一个。

 QFont f("Helvetica [Cronyx]");

您可以指定所需的铸造厂的家族名字。上面例子中的字体f将被设置为“Helvetica [Cronyx]”。

要确定窗口系统中实际使用的字体的属性,可以使用一个QFontInfo对象,例如:

 QFontInfo info(f1);
 QString family = info.family();

使用QFontMetrics对象来了解字体参数,例如:

 QFontMetrics fm(f1);
 int textWidthInPixels = fm.horizontalAdvance("How many pixels wide is this text?");
 int textHeightInPixels = fm.height();

有关字体的更多一般信息,请参见compat .fonts FAQ。关于编码的信息可以从 Roman Czyborra’s 上找到。

公共类型

enum Capitalization

此字体适用的文本的渲染选项,主要指大写

常量简介
MixedCase0这是普通的文本呈现选项,没有应用大小写更改。
AllUppercase1这将修改文本,使其呈现为全大写类型。
AllLowercase2这将修改文本,使其呈现为全小写类型。
SmallCaps3这将改变以小写字母呈现的文本。
Capitalize4这将修改文本,使其呈现为每个单词的第一个字符作为大写字符。

enum HintingPreference

此枚举描述了可应用于符号的不同级别的暗示,以提高显示器上的易读性,这可能是由像素密度保证的。

常量简介
PreferDefaultHinting0使用目标平台的默认提示级别。
PreferNoHinting1如果可能,呈现文本时不要暗示字形的轮廓。文本布局将在印刷上准确和可扩展,使用相同的标准,如打印时使用。
PreferVerticalHinting2如果可能的话,不要呈现水平暗示的文本,而是将字形垂直地对齐到像素网格上。在显示器上,当密度过低而不能准确显示符号时,文本将会显示得更清晰。但是由于字形的水平度量是没有暗示的,因此文本的布局将可扩展到密度更高的设备(如打印机),而不会影响换行等细节。
PreferFullHinting3如果可能的话,在水平和垂直方向上呈现文本暗示。文本将更名为优化目标设备上的易读性,但由于指标将取决于目标文本的大小,符号的位置,换行符,和其他印刷细节不会规模,这意味着一个文本布局看起来不同的设备和不同的像素密度。

请注意,enum只描述了一个首选项,因为所有Qt支持的平台都不支持完整范围的提示级别。下表详细说明了给定提示偏好对选定的目标平台集的影响。

PreferDefaultHintingPreferNoHintingPreferVerticalHinting
Windows Vista (w/o Platform Update) and earlierFull hintingFull hintingFull hinting
Windows 7 and Windows Vista (w/Platform Update) and DirectWrite enabled in QtFull hintingVertical hintingVertical hinting
FreeTypeOperating System settingNo hintingVertical hinting (light)
Cocoa on macOSNo hintingNo hintingNo hinting

注意: 可以通过DirectWrite字体引擎更改Windows上的提示首选项。这在安装平台更新后的Windows Vista和Windows 7上可用。为了使用这个扩展,配置Qt使用-directwrite。然后,目标应用程序将取决于DirectWrite在目标系统上的可用性。

有些细微的不同,可以通过放大镜软件查看。

enum SpacingType

间距类型,百分比和绝对值。

常量简介
PercentageSpacing0值100将保持间距不变;200的值将通过字符本身的宽度来扩大字符后面的间距。
AbsoluteSpacing1正值会增加相应像素的字母间距;负值会减小间距。

enum Stretch

遵循CSS命名约定的预定义拉伸值。值越高,文本就越拉伸。

常量简介
AnyStretch00 接受使用其他QFont属性匹配的拉伸(添加在Qt 5.8中)
UltraCondensed5050
ExtraCondensed6262
Condensed7575
SemiCondensed8787
Unstretched100100
SemiExpanded112112
Expanded125125
ExtraExpanded150150
UltraExpanded200200

See also setStretch() and stretch().

enum Style

该枚举描述了用于显示文本的不同字形样式。

常量简介
StyleNormal0无样式文字中使用的普通字形。
StyleItalic1专为表示斜体文本而设计的斜体字形。
StyleOblique2具有斜体外观的字形通常基于未样式化的字形,但出于表示斜体文本的目的而未进行微调。

enum StyleHint

如果选定的字体系列不可用,字体匹配算法将使用样式提示来查找适当的默认系列。

常量简介
Helvetica0是SansSerif的同义词。
Times1是Serif的同义词。
Courier2TypeWriter的同义词。
OldEnglish3字体匹配器首选的装饰字体。
System4字体匹配器首选的系统字体。
AnyStyle5离开字体匹配算法来选择系列。 这是默认值。
Cursive6字体匹配器首选的映射到CSS通用字体系列“草书”的字体。
Monospace7字体匹配器首选的映射到CSS通用字体系列“等宽字体”的字体。
Fantasy8字体匹配器首选的映射到CSS通用字体系列“ fantasy”的字体。
TypeWriterCourier字体匹配器首选的固定间距字体。
SansSerifHelvetica字体匹配器首选的无衬线字体。
DecorativeOldEnglish是OldEnglish的同义词。
SerifTimes字体匹配器首选的衬线字体。

enum StyleStrategy

样式策略告诉字体匹配算法应使用什么类型的字体来找到适当的默认系列。
可以使用以下策略:

常量简介
PreferDefault0x0001默认样式策略。它不喜欢任何类型的字体。
PreferBitmap0x0002首选位图字体(与轮廓字体相对)。
PreferDevice0x0004喜欢设备字体。
PreferOutline0x0008偏爱轮廓字体(与位图字体相对)。
ForceOutline0x0010强制使用轮廓字体。
NoAntialias0x0100不要对字体进行锯齿处理。
NoSubpixelAntialias0x0800如果可能,避免对字体使用亚像素抗锯齿。
PreferAntialias0x0080尽可能使用抗锯齿。
OpenGLCompatible0x0200不建议使用此样式策略。默认情况下,所有字体均兼容OpenGL。
NoFontMerging0x8000如果为某个书写系统选择的字体不包含要求绘制的字符,则Qt会自动选择一个包含该字符的外观相似的字体。 NoFontMerging标志禁用此功能。请注意,启用该标志不会阻止Qt在所选字体不支持文本书写系统时自动选择合适的字体。
PreferNoShaping0x1000有时,字体会将复杂的规则应用于一组字符,以便正确显示它们。在某些书写系统中,例如Brahmic脚本,为了使文本清晰易读,这是必需的。拉丁文字,它只是一个装饰性的功能。 PreferNoShaping标志将在不需要所有这些功能时将其禁用,这将在大多数情况下提高性能(自Qt 5.10起)。

这些中的任何一个都可以与以下标志之一进行或运算:

常量简介
PreferMatch0x0020喜欢完全匹配。 字体匹配器将尝试使用已指定的确切字体大小。
PreferQuality0x0040首选质量最好的字体。 字体匹配器将使用字体支持的最接近的标准磅值。
ForceIntegerMetrics0x0400不建议使用此样式策略。 使用QFontMetrics检索舍入的字体指标。

enum Weight

Qt使用从0到99的加权比例,与Windows或CSS中使用的比例相似但不相同。 权重0将变薄,而权重99将是黑色。
该枚举包含预定义的字体权重:

常量
Thin0
ExtraLight12
Light25
Normal50
Medium57
DemiBold63
Bold75
ExtraBold81
Black87

公共函数

构造、析构、复制

  1. QFont(const QFont &font)
  2. QFont(const QFont &font, const QPaintDevice *pd)
  3. QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false)
  4. QFont()
  5. QFont & operator=(QFont &&other)
  6. QFont & operator=(const QFont &font)
  7. ~QFont()
  8. void swap(QFont &other)

字体家族

  1. QString family() const
    void setFamily(const QString &family)
  2. QStringList families() const
    void setFamilies(const QStringList &families)

字体属性

  1. bool bold() const
    void setBold(bool enable) 粗体

  2. int weight() const
    void setWeight(int weight) 字重

  3. bool italic() const
    void setItalic(bool enable) 斜体

  4. int pixelSize() const
    void setPixelSize(int pixelSize) 像素大小

  5. int pointSize() const
    void setPointSize(int pointSize) 返回字体的点大小。如果以像素为单位指定字体大小,则返回-1。

  6. qreal pointSizeF() const
    void setPointSizeF(qreal pointSize)

  7. int stretch() const
    void setStretch(int factor) 设置字体的拉伸因子

    拉伸因子与字体的压缩或扩展版本匹配,或应用拉伸变换,将字体中所有字符的宽度更改百分之因子。例如,将factor设置为150将导致字体中的所有字符都宽1.5倍(即150%)。最小拉伸系数为1,最大拉伸系数为4000。默认的拉伸因子是AnyStretch,它将接受任何拉伸因子而不对字体应用任何转换。

    拉伸因子仅应用于轮廓字体。位图字体的拉伸因子被忽略。

    注意:当将字体与本机非默认拉伸因子匹配时,请求拉伸100会将其拉伸回中等宽度字体。

样式

  1. QFont::Style style() const
    void setStyle(QFont::Style style)
  2. QString styleName() const
    void setStyleName(const QString &styleName)
  3. QString defaultFamily() const 当前样式提示对应的系列名称
    QFont::StyleHint styleHint() const
    void setStyleHint(QFont::StyleHint hint, QFont::StyleStrategy strategy = PreferDefault)
  4. QFont::StyleStrategy styleStrategy() const
    void setStyleStrategy(QFont::StyleStrategy s) 样式提示和策略
  5. bool overline() const 上划线
    void setOverline(bool enable)
    bool strikeOut() const 删除线
    void setStrikeOut(bool enable)
    bool underline() const 下划线
    void setUnderline(bool enable)
  6. QFont::Capitalization capitalization() const
    void setCapitalization(QFont::Capitalization caps) 大写类型

间距

  1. bool fixedPitch() const
    void setFixedPitch(bool enable)

  2. qreal letterSpacing() const 字母间距
    void setLetterSpacing(QFont::SpacingType type, qreal spacing)
    QFont::SpacingType letterSpacingType() const

  3. qreal wordSpacing() const
    void setWordSpacing(qreal spacing) 词间距

  4. bool kerning() const
    void setKerning(bool enable) 是否启用此字体的紧密排列

    默认情况下,启用紧排。启用紧排后,glyph度量不再累加,即使对于拉丁文本也是如此。换言之,宽度(‘a’)+宽度(‘b’)等于宽度(“ab”)的假设不一定成立。

其它

  1. bool fromString(const QString &descrip)
    QString toString() const
    设置此字体以匹配描述说明。 描述是字体属性的逗号分隔列表,由toString() 返回。
  2. QFont::HintingPreference hintingPreference() const 字形渲染的提示
    void setHintingPreference(QFont::HintingPreference hintingPreference)
  3. bool exactMatch() const
    如果有与该字体设置完全匹配的窗口系统字体可用,则返回true。
  4. QString key() const
    回字体的键,即字体的文本表示形式。 它通常用作字体的缓存或字典的键。
  5. QFont resolve(const QFont &other) const
    返回一个新的QFont,该QFont具有从其他属性复制的,以前未在此字体上设置的属性。
  6. QVariant operator QVariant() const
  7. bool isCopyOf(const QFont &f) const 判断和 f 是否相等
    bool operator==(const QFont &f) const
  8. bool operator!=(const QFont &f) const
  9. bool operator<(const QFont &f) const

静态方法

  1. void insertSubstitution(const QString &familyName, const QString &substituteName)
  2. void insertSubstitutions(const QString &familyName, const QStringList &substituteNames)
  3. void removeSubstitutions(const QString &familyName)
  4. QString substitute(const QString &familyName)
  5. QStringList substitutes(const QString &familyName)
  6. QStringList substitutions()

相关的函数

  1. uint qHash(const QFont &font, uint seed = 0)
  2. QDataStream & operator<<(QDataStream &s, const QFont &font)
  3. QDataStream & operator>>(QDataStream &s, QFont &font)

演示代码

#include <QtWidgets>
#define WidgetType QLabel
int i=0,j=0;
QList<WidgetType *> widgetList;
QList<QLabel *> labelList;

QCommonStyle cs;

void addFrame(QWidget *parent){

    WidgetType *widget = new WidgetType(parent);
    widgetList.append (widget);

    QLabel *label = new QLabel(parent);
    label->setAlignment (Qt::AlignTop);
    label->setStyleSheet ("color:blue");
    labelList.append (label);

    auto *frame = new QFrame(parent);
    frame->setFrameStyle (QFrame::Panel | QFrame::Plain);

    auto *vBox = new QVBoxLayout(frame);
    vBox->addWidget (label,Qt::AlignCenter);
    vBox->addWidget (widget,Qt::AlignCenter);
    QGridLayout *mainLayout = qobject_cast<QGridLayout *>( parent->layout () );
    mainLayout->addWidget (frame,i,j);
    j++;
}

void setLabelText(int i,QString text){
    if(i >= labelList.count ()){
        return;
    }
    QLabel *label = labelList.at (i);
    label->setText (text);
}

WidgetType* getWidget(int i){
    if(i >= widgetList.count ()){
        qDebug() <<   __LINE__ <<"行 getWidget(int i) 函数 变量"<<    i  << "超出范围";
        i = 0;          // 超出范围默认使用 0
    }
    return  widgetList.at (i);
}

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);
    app.setApplicationName ("QFont");

    QDialog w;
    w.setWindowFlag (Qt::WindowContextHelpButtonHint,false);
    w.setLayout (new QGridLayout );

    addFrame (&w);
    addFrame (&w);
    addFrame (&w);
    addFrame (&w);

    getWidget (0)->setText ("QFont世界");
    getWidget (1)->setText ("QFont世界");
    getWidget (2)->setText ("QFont世界");
    getWidget (3)->setText ("QFont世界");

    setLabelText (0,"Overline");
    setLabelText (1,"Underline");
    setLabelText (2,"StrikeOut");
    setLabelText (3,"全部");

    QFont font = app.font ();
    font.setPixelSize (36);
//    font.setWeight (75);

    font.setOverline (true);
    getWidget (0)->setFont (font);
    font.setOverline (false);
    font.setUnderline (true);
    getWidget (1)->setFont (font);
    font.setUnderline (false);
    font.setStrikeOut (true);
    getWidget (2)->setFont (font);

    font.setOverline (true);
    font.setUnderline (true);
    getWidget (3)->setFont (font);

    w.show ();
    app.exec();
    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值