Qtを使用してGUIアプリケーションを作成しました。私のGUIアプリケーションには、プッシュボタンやラジオボタンなどのコントロールが含まれています。アプリケーションを実行すると、ボタンとボタン内のフォントが正常に見えます。ディスプレイのDPIスケーリングサイズを100%から150%または200%に変更すると、コントロールのフォントサイズは大きくなりますが、解像度に関係なくコントロールサイズ(プッシュボタン、ラジオボタン)はレンダリングされません。このため、コントロール内のテキストは途切れていました。添付の画像をご覧ください。
DPIスケーリングサイズが100%に設定されている場合のQtアプリケーションの外観
DPIスケーリングサイズが200%に設定されている場合のQtアプリケーションの外観
一部のタブレットでもアプリケーションを実行しています。タブレットでは、DPIスケール値は150%以上である必要があります。そうでない場合、すべてが非常に小さく表示されます。
私は、解像度とDPIスケール値に関係なくQtでUIアプリケーションを作成するためにWebで検索しましたが、運はありません。そこで私はここに自分の探求を投稿しています。これを取り除く方法があれば教えてください。
Qt 5.6以降では、高DPIサポートが有効になります。
アプリケーションのソースコードでQGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling)
を設定すると、自動高DPIスケーリングが可能になります。
注意:属性メソッドを使用するには、QApplication
オブジェクトを作成する前に属性を設定する必要があります。
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
return app.exec();
}
レイアウトを正しく使用すると役立ちます。
http://qt-project.org/doc/qt-4.8/layout.html
DPIの変更を処理することをOSに伝えると、予期しない予期しないフォントの変更を防ぐことができます。
http://msdn.Microsoft.com/en-us/library/ms701681(v = vs.85).aspx
重要な場所の間隔については、レンダリングされたフォントのサイズを確認し、結果のテキストのサイズに基づいてオブジェクトの最小サイズを設定できます。
http://qt-project.org/doc/qt-4.8/qfontmetrics.html#details
https://blog.qt.digia.com/blog/2009/06/26/improving-support-for-higher-dpi-on-Vista/
Qtの他の組み込み測定値で確認してみてください:
http://qt-project.org/doc/qt-4.8/qpaintdevice.html#widthMM
http://qt-project.org/doc/qt-4.8/qpaintdevice.html#logicalDpiX
QMLを使用している場合は、アンカーベースの配置のみの元のレイアウトを試してください。
http://qt-project.org/doc/qt-4.8/qml-anchor-layout.html
QApplication
には、ある程度関連する設定がいくつかあります。
http://qt-project.org/doc/qt-4.8/qapplication.html#setDesktopSettingsAware
フォントも手動で指定できます。
http://qt-project.org/doc/qt-4.8/qapplication.html#setFont
お役に立てば幸いです。
すべてのテキストサイズを拡大するためにWindowsアクセシビリティ設定を適用すると、ウィンドウに含まれるすべてのテキストに収まるほど大きくない固定サイズのウィンドウがありました。 Windowsはdpiの増加によりこれを行います。 OSのスケーリング係数を取得することでこれを修正し、ウィンドウのサイズとレイアウトの一部を調整しました(何らかの理由で自動的にスケーリングできませんでした)。
Dpiスケールを取得する方法は次のとおりです(「WindowsDpiScale.h」というファイル内)。
#ifndef WINDOWSDPISCALE_H
#define WINDOWSDPISCALE_H
#include <QtGlobal>
#ifdef Q_OS_WIN
#include <windows.h>
const float DEFAULT_DPI = 96.0;
float windowsDpiScale()
{
HDC screen = GetDC( 0 );
FLOAT dpiX = static_cast<FLOAT>( GetDeviceCaps( screen, LOGPIXELSX ) );
ReleaseDC( 0, screen );
return dpiX / DEFAULT_DPI;
}
#endif //Q_OS_WIN
#endif // WINDOWSDPISCALE_H
そして、私の場合にどのように適用したか:
...
#include "WindowsDpiScale.h"
MainWindow::MainWindow( QWidget *parent )
: QMainWindow( parent )
{
...
// Enlarge the window and various child widgets to accomendate
// OS display scaling (i.e. accessibily options)
setScaleToOsSettings();
...
}
void MainWindow::setScaleToOsSettings()
{
#ifdef Q_OS_WIN
setScale( windowsDpiScale() );
#endif
}
void MainWindow::setScale( float scale )
{
// Resize the window
this->setFixedSize( (int)(scale * this->maximumWidth()),
(int)(scale * this->maximumHeight()) );
// Resize the layouts within the stacked widget
foreach( QVBoxLayout * layout,
windowUi_->pagerStackedWidget->findChildren<QVBoxLayout *>() )
layout->parentWidget()->setFixedSize(
(int)(scale * layout->parentWidget()->contentsRect().width()),
(int)(scale * layout->parentWidget()->contentsRect().height()) );
}