【问题标题】:How do you get System default font settings in Qt?如何在 Qt 中获取系统默认字体设置?
【发布时间】:2012-06-16 04:42:02
【问题描述】:

我正在使用 Qt 构建一个桌面应用程序,我的开发机器是 win 7 x64 with Japanese locale,标准系统字体是 Meiryo。大多数win 7 UI都是这种字体,虽然经典/旧程序,如ui字体自定义窗口本身使用不同的字体,即MS UI Gothic。 直到我发现 QtCreator 在一个地方用 MS UI Gothic 构建我的应用程序,而在另一个地方用 Meiryo 构建我的应用程序时,这才困扰我。例如,qlabels、qlineedits、qcombobox 都使用 MS UI Gothic,但我稍后添加的带有 qtableview 的自定义完成器使用 Meiryo。

我在 QtCreator 的设计器中制作了大部分 UI,并在代码中添加了完成器。如果我在设计器中将所有小部件的字体更改为 Meiryo,那么应用程序当然会使用 Meiryo,因此看起来不错,但在这种情况下,我宁愿 Qt 自动为我选择任何系统的默认字体,因为 win 7 不是唯一的平台我将使用这个程序。

更让我担心的是 QApplication::font() 返回 MS UI Gothic,在我的情况下这是错误的。当然,我可以使用 QApplication::setFont() 设置应用程序范围的字体,但这违背了在没有微管理字体的情况下拥有原生外观的整个目的。

所以我的问题是,

  1. Qt 如何确定系统默认字体以及,
  2. 如果这是一个 Qt 错误,我该如何解决?
  3. 我应该如何在使用 .ui 文件的同时让我的 UI 在运行时使用默认系统字体?

我发现的一些澄清和事实

  1. 我希望我的应用程序对每个文本都使用系统默认字体。

  2. This discussion说Designer会添加字体信息,不管你想不想。所以 Qt 会尊重这个信息而不是系统默认字体。至少有人提到手动删除此信息应该使 Qt 在运行时选择系统默认字体。

  3. 在我的开发机器中,QApplication::font() 返回错误的默认字体。但是我稍后在代码中添加的 QTableView 怎么会使用 RIGHT 字体?它是从哪里得到这些信息的?

因此,如果我找到 QTableView 找到此信息的位置,我可以在 main 中获取它,并使用 QApplication::setFont() 将其设置为应用程序范围。然后剩下的就是手动删除所有字体信息,然后希望它会起作用。但这就像我们首先使用 Qt 的原因,不是吗?

【问题讨论】:

  • p.s Qt Demo 程序也显示了这些症状,而且我不使用二进制 QtSDK,我自己为每个 x86 和 x64 编译 Qt,并使用 QtCreator(二进制分发的)。我的工具链是 msvc2010 express。
  • 除非另有说明,Qt 使用默认的系统字体来呈现文本。 This post 简要讨论了在不同操作系统上默认使用的字体。也许我很困惑,如果您只想要每个操作系统的默认系统字体,不要做任何事情,这就是您将得到的...如果您出于某种原因需要知道该字体是什么,try this
  • 不,这个假设似乎是错误的。见this。 Designer 将为 .ui 文件添加字体信息,并且没有关闭它的选项。我想要的是默认字体,不管我使用 .ui 文件的事实。我的问题是双重的,因为 Qt 还在 QApplication::font() 中返回了错误的默认字体。
  • 发现 this answer 在完全不同的环境中,但仍然适用。我非常喜欢 Qt,但如果他们想保持“跨平台”声明,这些事情应该尽快解决
  • 根据您链接的上一个堆栈溢出帖子,您似乎只能执行以下操作:“...我们必须搜索所有 .ui 文件,以确保没有平台- 自上一版本以来,特定字体信息已潜入任何 .ui 文件。”换句话说,在发布时,您似乎必须仔细阅读并删除任何提及字体的内容,这非常令人沮丧(如果可能的话。我不使用设计器,因此无法直接评论它)。很抱歉,我一开始对此并不了解,我倾向于回避设计师并从头开始编写我的 Qt 代码。

标签: qt windows-7 fonts locale qt4.7


【解决方案1】:

Qt 将调用 Windows API SystemParametersInfo 获取 QMenuQMessageBox 等的字体,并使用 GetStockObject 获取默认系统字体。一些小部件具有与系统默认字体不同的特殊字体。我认为 Qt 的做法是正确的,但默认的日文/中文衬线字体在 HiDPI 显示器上看起来很糟糕。

只需使用 QFont QApplication::font ( const char * className ) 即可获得正确的字体(在您的情况下为 Meryo),例如 qApp->setFont(QApplication::font("QMenu"))

【讨论】:

    【解决方案2】:

    我能想到两种可能的解决方案:

    1. 您可以在您的应用程序中打包一个字体作为资源文件,这样所有平台都将使用该字体,而不管当前系统的默认字体。

    2. QFont 类有一个名为defaultFamily() 的方法。使用它,您可以手动设置整个 QApplication 的默认字体。

    一个例子(主要方法):

    QApplication application(argc, argv);
    QFont font;
    font.setFamily(font.defaultFamily());
    application.setFont(font);
    ...rest of your code...
    

    【讨论】:

    • defaultFamily() 在 Mac 上只返回一些硬编码的名称,而不是系统本身指定的名称。
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2010-12-26
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多