如何在Qt中获得系统默认字体设置?

如何在Qt中获得系统默认字体设置?,qt,windows-7,fonts,locale,qt4.7,Qt,Windows 7,Fonts,Locale,Qt4.7,我正在使用Qt构建一个桌面应用程序,我的开发机器是win7x64,带有日语语言环境,标准系统字体是。大多数win 7 UI都使用这种字体,尽管经典/旧版程序(如UI字体自定义窗口)本身使用不同的字体,即MS UI哥特式字体。 直到我发现QtCreator在一个地方用MS-UI-Gothic构建了我的应用程序,在另一个地方用Meiryo构建了我的应用程序,这才让我感到困扰。例如,qlabels、qlineedits、qcombobox都使用MS UI哥特式,但我稍后添加的带有qtableview的

我正在使用Qt构建一个桌面应用程序,我的开发机器是win7x64,带有日语语言环境,标准系统字体是。大多数win 7 UI都使用这种字体,尽管经典/旧版程序(如UI字体自定义窗口)本身使用不同的字体,即MS UI哥特式字体。 直到我发现QtCreator在一个地方用MS-UI-Gothic构建了我的应用程序,在另一个地方用Meiryo构建了我的应用程序,这才让我感到困扰。例如,qlabels、qlineedits、qcombobox都使用MS UI哥特式,但我稍后添加的带有qtableview的自定义补全符使用Meiryo

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

更让我担心的是QApplication::font()返回MS UI哥特式,在我的例子中,这是错误的。当然,我可以使用QApplication::setFont()设置应用程序范围内的字体,但这违背了在不进行字体微观管理的情况下实现本机外观的全部目的

所以我的问题是,

  • Qt如何确定系统默认字体和
  • 如果这是一个Qt错误,我该如何着手解决它
  • 我应该如何使用.ui文件,并且在运行时仍让我的ui使用默认系统字体
  • 我发现的一些澄清和事实

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

  • 说无论你是否想要,设计师都会添加字体信息。因此,Qt将尊重此信息,而不是系统默认字体。至少有人提到手动删除此信息应该使Qt pick系统在运行时成为默认字体

  • 在我的开发机器中,QApplication::font()返回错误的默认字体。但是为什么我在后面的代码中添加的QTableView使用正确的字体呢?它是从哪里得到这些信息的


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

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

  • 您可以将字体作为资源文件打包到应用程序中,这样所有平台都将使用该字体,而不管当前系统的默认字体如何

  • QFont类有一个名为的方法。使用此选项,您可以手动设置整个屏幕的默认字体

  • 示例(主要方法):


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


    只需使用
    QFont-QApplication::font(const-char*className)
    来获得正确的字体(在您的例子中是Meryo),例如
    qApp->setFont(QApplication::font(“QMenu”))

    p.s Qt演示程序也显示了这些症状,我没有使用二进制QtSDK,我自己为每个x86和x64编译了Qt,并从QtCreator使用了这两种字体(二进制分布式)。我的工具链是msvc2010 express。除非另有规定,否则Qt使用默认系统字体来呈现文本。简要讨论了不同操作系统上默认使用的字体。也许我有点困惑,如果您只需要每个操作系统的默认系统字体,请不要做任何事情,这就是您将得到的…如果您需要知道该字体的用途,请由于某些原因,.No似乎这个假设是错误的。请参阅。Designer将为.ui文件添加字体信息,并且没有关闭它的选项。我想要的是默认字体,而不管我使用的是什么.ui文件。我的问题是双重的,因为Qt在QApplication::font()中也返回了错误的默认字体.在完全不同的上下文中发现,但仍然适用。我非常喜欢Qt,但这些问题应该很快得到解决。如果他们想根据您链接的上一篇堆栈溢出文章保持“跨平台”分类,您似乎只能做以下操作:“…我们必须搜索所有的.ui文件,以确保自上一版本以来没有任何平台特定的字体信息潜入到任何.ui文件中。”换句话说,在发布时,您似乎必须浏览并删除任何提及字体的内容,这非常令人沮丧(如果可能的话。我不使用designer,所以不能直接对其进行评论)。很抱歉,我一开始对此不太了解,我倾向于避开designer,从头开始编写Qt代码。Mac上的defaultFamily()只返回一些硬编码的名称,而不是系统本身指定的名称。
    QApplication application(argc, argv);
    QFont font;
    font.setFamily(font.defaultFamily());
    application.setFont(font);
    ...rest of your code...