web-dev-qa-db-ja.com

Qtでシステムのデフォルトフォント設定を取得するにはどうすればよいですか?

Qtを使用してデスクトップアプリを構築しています。開発マシンは日本のロケールでwin7 x64であり、標準のシステムフォントは Meiryo です。 Win 7 UIのほとんどはこのフォントですが、UIフォントのカスタマイズウィンドウなどのクラシック/古いプログラム自体は、MSUIゴシックである別のフォントを使用しています。 QtCreatorがMSUI Gothicを使用してアプリを構築し、Meiryoをもう一方の場所に構築していることがわかるまで、これは気になりません。たとえば、qlabels、qlineedits、qcomboboxはすべてMS UI Gothicを使用しますが、後で追加するqtableviewを備えたカスタムコンプリーターはMeiryoを使用します。

QtCreatorのデザイナーでUIのほとんどを作成し、コードでコンプリーターを追加しました。 The DesignerですべてのウィジェットのフォントをMeiryoに変更すると、もちろんアプリはMeiryoを使用するため、正しく表示されますが、この場合、Win 7だけではないため、システムのデフォルトフォントを自動的に選択します。プラットフォームこのプログラムを使用します。

私の懸念をさらに引き起こしたのは、QApplication :: font()がMS UI Gothicを返すことです。これは、私の場合は誤りです。もちろん、QApplication :: setFont()を使用してアプリ全体のフォントを設定することはできますが、フォントを細かく管理せずにネイティブのルックアンドフィールを使用するという目的全体が無効になります。

だから私の質問は、

  1. qtはシステムのデフォルトフォントをどのように決定しますか?
  2. これがQtバグの場合、どうすれば回避できますか?
  3. .uiファイルを使用し、実行時にUIでデフォルトのシステムフォントを使用するにはどうすればよいですか?

私が見つけたいくつかの説明と事実

  1. アプリですべてのテキストにシステムのデフォルトフォントを使用したい。

  2. このディスカッション デザイナーは、必要かどうかに関係なく、フォント情報を追加すると述べました。したがって、Qtは、システムのデフォルトフォントではなく、この情報を尊重します。少なくとも誰かがこの情報を手動で削除することに言及した場合、Qtは実行時にシステムのデフォルトフォントを選択する必要があります。

  3. 私の開発マシンでは、QApplication :: font()は間違ったデフォルトフォントを返します。しかし、後でコードに追加するQTableViewがRIGHTフォントを使用するのはなぜですか?この情報はどこで入手したのですか?

したがって、QTableViewがこの情報を見つける場所を見つけたら、それをmainで取得し、QApplication :: setFont()を使用してアプリ全体に設定できます。次に残っているのは、すべてのフォント情報を手動で削除することです。そうすれば、うまく機能します。しかし、これは私たちが最初にQtを使用する理由のようなものですよね?

18
Evan

私は2つの可能な解決策を考えることができます:

  1. アプリケーションにフォントをリソースファイルとしてパックすることができます。これにより、現在のシステムのデフォルトフォントに関係なく、すべてのプラットフォームでそのフォントが使用されます。

  2. QFontクラスには defaultFamily() というメソッドがあります。これを使用して、全体のデフォルトフォントを手動で設定できます QApplication

例(メインメソッド):

QApplication application(argc, argv);
QFont font;
font.setFamily(font.defaultFamily());
application.setFont(font);
...rest of your code...
10
Balázs Édes

QtはWindowsAPI SystemParametersInfoを呼び出してQMenuQMessageBoxなどのフォントを取得し、GetStockObjectを使用してデフォルトのシステムフォントを取得します。一部のウィジェットには、システムのデフォルトフォントとは異なる特別なフォントがあります。 Qtは正しいことをしていると思いますが、デフォルトの日本語/中国語のセリフフォントはHiDPIモニターでは見栄えがよくありません。

QFont QApplication::font ( const char * className )を使用して、qApp->setFont(QApplication::font("QMenu"))などの適切なフォント(この場合はMeryo)を取得します。

3
krrr