19

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

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

所以我的问题是,

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

我发现的一些澄清和事实

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

  2. 这个讨论说无论你是否想要,设计师都会添加字体信息。所以 Qt 会尊重这个信息而不是系统默认字体。至少有人提到手动删除此信息应该使 Qt 在运行时选择系统默认字体。

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

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

4

2 回答 2

12

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

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

  2. QFont 类有一个名为defaultFamily(). 使用它,您可以手动设置整个QApplication.

一个例子(主要方法):

QApplication application(argc, argv);
QFont font;
font.setFamily(font.defaultFamily());
application.setFont(font);
...rest of your code...
于 2012-08-29T13:51:58.253 回答
6

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

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

于 2016-11-02T13:04:16.703 回答