Изменение размера экрана 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, но не повезло. Поэтому я отправляю свои задания здесь. Пожалуйста, дайте мне знать, есть ли способ избавиться от этого.
Ответы
Ответ 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()) );
}