Я создал некоторое приложение с графическим интерфейсом, используя Qt. Мое приложение GUI содержит элементы управления, такие как кнопка и переключатель. Когда я запускаю приложение, кнопки и шрифты внутри кнопки выглядят нормально. Когда я изменяю размер экрана в DPI от 100% до 150% или 200%, размер шрифта элементов управления увеличивается, но не размер элемента управления (кнопка, переключатель) независимо от разрешения. Из-за этого текст внутри элементов управления был обрезан. пожалуйста, смотрите прикрепленное изображение.
Приложение Qt смотрит, когда размер масштабирования DPI установлен на 100%
Приложение Qt смотрит, когда размер масштабирования DPI установлен на 200%
Я также запускаю свое приложение на некоторых планшетах. В планшетах значение масштаба DPI должно быть больше 150%, иначе все будет отображаться очень маленьким.
Я искал в Интернете создание пользовательского интерфейса в Qt независимо от разрешения и значения масштаба DPI, но не повезло. Итак, я публикую свой квест здесь. Пожалуйста, дайте мне знать, если есть какой-то способ избавиться от этого.
Поддержка высокого DPI включена с Qt 5.6 и выше.
настройка QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling)
в вашем приложении исходный код позволяет автоматическое масштабирование с высоким разрешением.
ЗАМЕЧАНИЕ. Чтобы использовать метод атрибута, вы должны установить атрибут перед созданием 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, предотвратит странные изменения шрифтов, которых вы не ожидали.
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, увеличивается. Я исправил это, получив коэффициент масштабирования ОС, а затем отрегулировал размер моего окна и некоторых его макетов (которые по какой-то причине я не смог автоматически масштабировать).
Вот как я получил шкалу 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()) );
}