高dpiのWindows(96dpiではなく192dpi)で実行する必要があるQtアプリケーションを書いています。
残念ながら、Qtフレームワークはまだ(少なくともWindowsでは)high-dpiをサポートしていないため、私のアプリケーションとそのすべての要素は、必要なサイズの半分に見えます。
Windowsでそのようなアプリの自動アップスケーリングを強制/シミュレーションする方法はありますか?
固定座標とサイズを使用するアプリケーションは、高DPI解像度では小さく見えます。レイアウトを使用している場合でも、要素とフォントのサイズとマージンに関していくつかの問題があります。幸い、Qt 5.4以降、多くの 高DPIの問題の修正 が行われたため、高DPIディスプレイがサポートされています。
Windows上のアプリケーションは、次のいずれかのレベルの「DPI認識」を想定できます(Qtドキュメントから)。
- DPI Unaware:このレベルはWindows-Vistaで導入されました。 Windowsは、1920x1080の96 DPIの標準ディスプレイ上で実行しているように見せかけ、それに応じてアプリケーションをスケーリングします。低DPIディスプレイ用に設計された古いアプリケーションに対応することを目的としています。一部のアーティファクトは、このタイプのスケーリングから生じる可能性があります。
- System-DPI対応:このレベルはWindows-Vistaで導入されました。複数のモニターが接続されている場合のみ、モニターごとのDPI認識とは異なります。 Windowsは、接続されているすべてのモニターに適したスケーリングを計算します。
- モニターごとのDPI対応:このレベルはWindows 8.1で導入されました。 Windowsはスケーリングをまったく実行しません。
また、それは述べています:
Qtアプリケーションは、デフォルトでは、Windows 8.1ではPer-Monitor DPI Aware、または古いバージョンのWindowsではSystem-DPI Awareです。 Qt 5.4以降では、プラットフォームプラグインにパラメーターを渡すことでレベルを指定できます(qt.confの使用を参照)。
<application> -platform windows:dpiawareness=0,1,2
詳細は こちら をご覧ください。
一般に、高DPIディスプレイで優れたUIを使用するには、以下を検討してください。
Qt::AA_UseHighDpiPixmaps
属性は、QPainter
およびピックスマップを使用する場合、または特別な状況で特定の要素サイズを調整するためのスケーリング比を計算する場合に使用します。Qtは、属性または環境変数を介して、Qt 5.6以降の高DPIモニターを完全にサポートします(サポートがネイティブであるOS Xを除く)。属性メソッドには、次を使用します。
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // DPI support
QApplication app(argc, argv);
return app.exec();
}
または、システム環境変数を設定します。
QT_AUTO_SCREEN_SCALE_FACTOR=1
高DPIサーフェイスブックモニターを備えたWindows 10で両方の方法をテストしましたが、結果は期待どおりに適切にスケーリングされています。
これは、Windowsで問題を解決する最も簡単な方法です。
実行可能ファイルの横にqt.confファイルを作成し(まだそこにない場合)、以下を追加します。
[Platforms]
WindowsArguments = dpiawareness=0
拡大するとウィンドウがぼやけて表示されます。このソリューションの大きな利点は、WindowsがQtではなくスケーリングを行うことです。したがって、アーティファクトの発生が最小限に抑えられます。さらに、これは再構築を必要としないため、すでに配布されているアプリに適用できます。
もちろん、これは最も好ましい結果ではありませんが、短期間に問題を解決するのに最も早く、プレッシャーなしで「実際の」DPI対応バージョンを開発できます。
Qt 4.8を使用しています。まず、レイアウトを使用する必要があります。私の目標は、ユーザーがダイアログやフォームなどのサイズを変更できないようにすることでした。
このコードをダイアログコンストラクターに配置することで、さまざまなDPIで正しい表示結果が得られました。
_adjustSize();
setFixedSize(size());
_
最初の行adjustSize()
は、その内容に合わせてダイアログのサイズを調整します。 2行目setFixedSize(size())
は、ダイアログのサイズをコンテンツに合わせて調整した後、ユーザーがサイズを変更できないようにしてダイアログのサイズを修正します。サイズポリシーを設定する必要はありません。