Подтвердить что ты не робот

Изменение размера экрана DPI для отображения делает размер шрифта приложения Qt более рентабельным

Я создал приложение GUI с использованием Qt. Приложение моего графического интерфейса содержит элементы управления, такие как кнопка и переключатель. Когда я запускаю приложение, кнопки и шрифты внутри кнопки выглядят нормально. Когда я изменяю размер масштабирования DPI от 100% до 150% или 200%, размер шрифта элементов управления больше, но не размер управления (кнопка, переключатель), независимо от разрешения. Из-за этого текст внутри элементов управления был отключен. см. прикрепленное изображение.

Внешний вид приложения Qt, когда размер масштабирования DPI установлен на 100%

Qt application look when DPI scaling size set to 100%

Внешний вид приложения Qt, когда размер масштабирования DPI установлен на 200%

Qt application look when DPI scaling size set to 200%

Я запускаю свое приложение и в некоторых таблицах. В таблетках значение шкалы DPI должно быть более 150%, иначе все будет отображаться очень мало.

Я искал в Интернете для создания приложения UI в Qt независимо от разрешения и значения масштаба DPI, но не повезло. Поэтому я отправляю свои задания здесь. Пожалуйста, дайте мне знать, есть ли способ избавиться от этого.

4b9b3361

Ответ 1

Поддержка высокого уровня DPI включена в Qt 5.6.

Настройка 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();
}

Ответ 2

Использование макетов правильно может помочь.

http://qt-project.org/doc/qt-4.8/layout.html

Сообщая ОС, что вы обрабатываете изменения DPI, предотвратите странные изменения шрифтов, которых вы не ожидали.

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

Надеюсь, что это поможет.

Ответ 3

У меня было окно с фиксированным размером, которое было недостаточно большим, чтобы вместить весь текст, который он содержал при настройках доступности 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()) );
}