web-dev-qa-db-ja.com

ディスプレイのDPIスケーリングサイズを変更すると、Qtアプリケーションのフォントサイズが大きくなります

Qtを使用してGUIアプリケーションを作成しました。私のGUIアプリケーションには、プッシュボタンやラジオボタンなどのコントロールが含まれています。アプリケーションを実行すると、ボタンとボタン内のフォントが正常に見えます。ディスプレイのDPIスケーリングサイズを100%から150%または200%に変更すると、コントロールのフォントサイズは大きくなりますが、解像度に関係なくコントロールサイズ(プッシュボタン、ラジオボタン)はレンダリングされません。このため、コントロール内のテキストは途切れていました。添付の画像をご覧ください。

DPIスケーリングサイズが100%に設定されている場合のQtアプリケーションの外観

Qt application look when DPI scaling size set to 100%

DPIスケーリングサイズが200%に設定されている場合のQtアプリケーションの外観

Qt application look when DPI scaling size set to 200%

一部のタブレットでもアプリケーションを実行しています。タブレットでは、DPIスケール値は150%以上である必要があります。そうでない場合、すべてが非常に小さく表示されます。

私は、解像度とDPIスケール値に関係なくQtでUIアプリケーションを作成するためにWebで検索しましたが、運はありません。そこで私はここに自分の探求を投稿しています。これを取り除く方法があれば教えてください。

32
Arun

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();
}
18

レイアウトを正しく使用すると役立ちます。

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

お役に立てば幸いです。

9
phyatt

すべてのテキストサイズを拡大するために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()) );
}
5
BuvinJ