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

时间:2012-06-13 08:46:14

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

我正在使用Qt构建桌面应用程序,我的开发机器使用日语语言环境赢得7 x64,标准系统字体为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仍然在运行时使用默认系统字体?
  4. 我发现的一些澄清和事实

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

    2. This discussion表示Designer会添加字体信息,无论您是否愿意。因此Qt将尊重此信息而不是系统默认字体。至少有人提到手动删除这些信息应该在运行时使Qt选择系统默认字体。

    3. 在我的开发机器中,QApplication :: font()返回WRONG默认字体。但是我后来在代码中添加的QTableView如何使用RIGHT字体?它从哪里得到这个信息?

    4. 因此,如果我发现QTableView在哪里找到此信息,我可以在main中获取它,并使用QApplication :: setFont()将其设置为app。然后剩下的是手动删除所有字体信息,然后HOPEFULLY它将工作。但这就像我们首先使用Qt的原因不是吗?

2 个答案:

答案 0 :(得分:10)

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

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

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

  3. 一个例子(主要方法):

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

答案 1 :(得分:3)

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

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