2016-12-07 17 views
2

Используя Qt5.6.1, я использую QtWinMigrate для размещения виджета Qt в родительском окне. Когда родитель приложение масштабируется высокой точек на дюйм монитор, следующую строку:Создание QApplication изменяет размер родительского (не-Qt-окно) при высоком разрешении на дюйм на мониторе 4k

pApp = new QApplication(argc, argv); 

убивает масштабирование, изменение размера родительского окна, так что 150% или 200% масштабирование, по-видимому подскакивает до 100%. Это до того, как я даже создал свое окно Qt - только конструктор QApplication делает это. Я пробовал разные трюки. Файл qt.conf так:

[Platforms] 
WindowsArguments = dpiawareness=0,1,2 

или до создания QApplication:

QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 
QApplication::setDesktopSettingsAware(true); 

Ни один из них не кажется, чтобы иметь эффект. Как я могу предотвратить это изменение размера?

ответ

2

В qt.conf мы должны использовать одно значение для параметра Awareness DPI:

[Platforms] 
WindowsArguments = dpiawareness=2 
# either 0 or 1 or 2 

Если вы хотите использовать эту dpiawareness из qt.conf установки и предотвратить Qt GUI от автоматического масштабирования, использовать значение 2, которое является Per Монитор DPI Aware и не обрабатывается Qt. «Per-monitor DPI aware», используемый для того, чтобы позволить системе отправлять событие в окно при перетаскивании с одного монитора на другой. Это похоже на то, что приложение GUI будет работать с естественным API, либо обрабатывая, либо не обрабатывая это event. Остальная часть масштабирования пользовательского интерфейса в этом случае просто отключена, но ни один из DPI Unaware (0) или System DPI Aware (1) не сделает масштабирование. Qt High DPI Displays статья описывает эти режимы, но, по-видимому, недостаточно ясна, поэтому я рассказываю вам по собственному опыту.

Вы также можете не использовать либо qt.conf вообще или не использовать атрибут dpiawareness и эта шкала также будет не графический интерфейс.

Говоря о конструкторе QApplication, он просматривает настройки приложения DPI. Общий шаблон для начинающего Qt приложения следующих документов:

#include "mywidget.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    // it is usually on the stack 
    QApplication a(argc, argv); 
    MyWidget w; 
    w.show(); 

    return a.exec(); 
} 

.. так что вам не придется делать new QApplication(argc, argv) или выделить объект приложения на куче вообще.

+0

Как бы то ни было, я выделяю QApplication в куче, потому что, как я уже упоминал, это размещенная Dll в другом приложении, а функция инициализации возвращается родительскому после создания QApplication. Помимо того, что глобальная реализация QApplication будет проблематичной несколькими способами, выделение ее стеком приведет к ее удалению после инициализации. – Roderick

+0

@Roderick, вы все равно можете выделить объект приложения в стеке, пока цикл цикла будет запущен в этом потоке, но вы должны убедиться, что поток завершает цикл до его уничтожения. – AlexanderVX

+0

Это не так, как эта конкретная реализация работает по причинам, слишком многочисленным и вне темы для обсуждения здесь. Это не очень актуально, проблема в том, что Qt распознает настройку конфигурации. – Roderick