Qt 字型(04):QFont類【官翻】

hitzsf發表於2020-11-13

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()。其餘的屬性必須在contstruction之後設定,例如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上找到。

公共型別

  1. enum Capitalization
    此字型適用於的文字呈現選項。

    常量簡介
    MixedCase0這是普通的文字呈現選項,沒有應用大小寫更改。
    AllUppercase1這將修改文字,使其呈現為全大寫型別。
    AllLowercase2這將修改文字,使其呈現為全小寫型別。
    SmallCaps3這將改變以小寫字母呈現的文字。
    Capitalize4這將修改文字,使其呈現為每個單詞的第一個字元作為大寫字元。
  2. 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在目標系統上的可用性。

  3. enum SpacingType

    常量簡介
    PercentageSpacing0值100將保持間距不變;200的值將通過字元本身的寬度來擴大字元後面的間距。
    AbsoluteSpacing1正值會增加相應畫素的字母間距;負值會減小間距。
  4. enum Stretch
    遵循CSS命名約定的預定義拉伸值。值越高,文字就越拉伸。

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

    See also setStretch() and stretch().

  5. enum Style
    該列舉描述了用於顯示文字的不同字形樣式。

    常量簡介
    StyleNormal0無樣式文字中使用的普通字形。
    StyleItalic1專為表示斜體文字而設計的斜體字形。
    StyleOblique2具有斜體外觀的字形通常基於未樣式化的字形,但出於表示斜體文字的目的而未進行微調。
  6. enum StyleHint
    如果選定的字型系列不可用,字型匹配演算法將使用樣式提示來查詢適當的預設系列。

    常量簡介
    Helvetica0是SansSerif的同義詞。
    Times1是Serif的同義詞。
    Courier2TypeWriter的同義詞。
    OldEnglish3字型匹配器更喜歡裝飾字型。
    System4字型匹配器更喜歡系統字型。
    AnyStyle5離開字型匹配演算法來選擇系列。 這是預設值。
    Cursive6字型匹配器更喜歡對映到CSS通用字型系列“草書”的字型。
    Monospace7字型匹配器更喜歡對映到CSS通用字型系列“等寬字型”的字型。
    Fantasy8字型匹配器更喜歡對映到CSS通用字型系列“ fantasy”的字型。
    TypeWriterCourier字型匹配器更喜歡固定間距字型。
    SansSerifHelvetica字型匹配器首選無襯線字型。
    DecorativeOldEnglish是OldEnglish的同義詞。
    SerifTimes字型匹配器更喜歡襯線字型。
  7. 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檢索舍入的字型指標。
  8. enum Weight
    Qt使用從0到99的加權比例,與Windows或CSS中使用的比例相似但不相同。 權重0將變薄,而權重99將是黑色。
    該列舉包含預定義的字型權重:

    常量簡介
    Thin00
    ExtraLight1212
    Light2525
    Normal5050
    Medium5757
    DemiBold6363
    Bold7575
    ExtraBold8181
    Black8787

公共函式

  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. void swap(QFont &other)
    交換QFont
  8. QFont resolve(const QFont &other) const
    返回一個新的QFont,該QFont具有從其他屬性複製的,以前未在此字型上設定的屬性。
  9. QString key() const
    返回字型的鍵,即字型的文字表示形式。 它通常用作字型的快取或字典的鍵。
  10. ~QFont()
    析構
  11. bool exactMatch() const
    如果有與該字型設定完全匹配的視窗系統字型可用,則返回true。
  12. bool isCopyOf(const QFont &f) const
  13. bool operator==(const QFont &f) const
    判斷和 f 是否相等
  14. bool fromString(const QString &descrip)
  15. QString toString() const
    設定此字型以匹配描述說明。 描述是字型屬性的逗號分隔列表,由toString() 返回。
  16. bool bold() const
  17. void setBold(bool enable)
    粗體
  18. bool italic() const
  19. void setItalic(bool enable)
    斜體
  20. int weight() const
  21. void setWeight(int weight)
    字型權重
  22. QFont::Capitalization capitalization() const
  23. void setCapitalization(QFont::Capitalization caps)
    大寫型別
  24. QStringList families() const
  25. void setFamilies(const QStringList &families)
    返回所請求的字型系列名稱列表,即在上一次setFamilies() 呼叫中或通過建構函式設定的名稱。 否則,它將返回一個空列表。
  26. QString family() const
  27. void setFamily(const QString &family)
    字型系列名稱
  28. bool fixedPitch() const
  29. void setFixedPitch(bool enable)
    固定間距,參閱 QFontInfo.
  30. QFont::HintingPreference hintingPreference() const
  31. void setHintingPreference(QFont::HintingPreference hintingPreference)
    字形渲染的提示
  32. bool kerning() const
  33. void setKerning(bool enable)
    字型的字距設定。預設情況下,字距設定是啟用的。
    當字距設定被啟用時,字形度量不再加起來,即使對於拉丁文字也是如此。換句話說,寬度(‘a’)+寬度(‘b’)等於寬度(‘ab’)的假設不一定是正確的。
  34. qreal letterSpacing() const
  35. QFont::SpacingType letterSpacingType() const
  36. void setLetterSpacing(QFont::SpacingType type, qreal spacing)
    字母間距
  37. qreal wordSpacing() const
  38. void setWordSpacing(qreal spacing)
    詞間距
  39. bool overline() const
  40. void setOverline(bool enable)
    上劃線
  41. bool underline() const
  42. void setUnderline(bool enable)
    下劃線
  43. bool strikeOut() const
  44. void setStrikeOut(bool enable)
    刪除線
  45. int pixelSize() const
  46. void setPixelSize(int pixelSize)
  47. int pointSize() const
  48. void setPointSize(int pointSize)
  49. qreal pointSizeF() const
  50. void setPointSizeF(qreal pointSize)
    字型大小
  51. int stretch() const
  52. void setStretch(int factor)
    拉伸係數
  53. QString defaultFamily() const
    當前樣式提示對應的系列名稱
  54. QFont::Style style() const
  55. void setStyle(QFont::Style style)
    字型樣式
  56. QString styleName() const
  57. void setStyleName(const QString &styleName)
    樣式名稱
  58. QFont::StyleStrategy styleStrategy() const
  59. void setStyleStrategy(QFont::StyleStrategy s)
    樣式策略
  60. QFont::StyleHint styleHint() const
  61. void setStyleHint(QFont::StyleHint hint, QFont::StyleStrategy strategy = PreferDefault)
    樣式提示和策略
  62. QVariant operator QVariant() const
  63. bool operator!=(const QFont &f) const
  64. 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)

相關文章