Intereting Posts
Как читать произвольное количество значений с помощью std :: copy? Каким образом память кучи и стека изменена, реализована, выделена Внутренний угол между двумя линиями тест утечки памяти c ++ C ++ и DirectX Я могу видеть прямо через модели и мир, как будто все было прозрачно? виртуальный дескриптор на чистом абстрактном базовом classе C ++ 11 – emplace_back между двумя векторами не работает Удалить все узлы в связанном списке Существует ли стандартный способ определения во время компиляции, если система 32 или 64 бит? Coverity и C ++: куча (с новым) и распределение по стеку C ++ 11 Безопасность streamов генераторов случайных чисел Можно ли мутировать объекты с помощью std :: for_each? Переменные, помеченные как const с использованием структурированных привязок, не являются константами Получить указатель на объект из указателя на некоторый член c ++ 11-членная функция возвращает вектор исходных указателей из вектора unique_ptr

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

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

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

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

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

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

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

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

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

    Настройка QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling) в исходном коде приложения позволяет автоматически масштабировать высокое значение DPI.

    УВЕДОМЛЕНИЕ. Чтобы использовать метод атрибута, вы должны установить атрибут перед созданием объекта QApplication :

     #include  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. Я исправил это, вернув коэффициент масштабирования os, а затем скорректировал размер моего windows и некоторые его макеты (которые я не мог автоматически масштабировать по какой-то причине).

    Вот как я получил масштаб dpi (в файле под названием «WindowsDpiScale.h»):

     #ifndef WINDOWSDPISCALE_H #define WINDOWSDPISCALE_H #include  #ifdef Q_OS_WIN #include  const float DEFAULT_DPI = 96.0; float windowsDpiScale() { HDC screen = GetDC( 0 ); FLOAT dpiX = static_cast( 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 (ie 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() ) layout->parentWidget()->setFixedSize( (int)(scale * layout->parentWidget()->contentsRect().width()), (int)(scale * layout->parentWidget()->contentsRect().height()) ); }