2

使用 Qt5.6.1,我正在使用 QtWinMigrate 在父窗口中容纳 Qt 小部件。当父应用程序针对高 dpi 监视器进行缩放时,以下行:

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);

似乎都没有效果。如何防止这种调整大小?

4

1 回答 1

2

qt.conf我们应该为 DPI Awareness 设置使用一个值:

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

如果要使用此dpiawareness设置qt.conf并防止 Qt GUI 自动缩放,请使用值 2,它是 Per Monitor DPI Aware 且不由 Qt 处理。“每监视器 DPI 感知”用于允许系统在将事件从一个监视器拖到另一个监视器时将事件向下发送到窗口。就像 GUI 应用程序将使用自然 API 一样,处理或不处理该事件。在这种情况下,UI 缩放的其余部分被禁用,但 DPI Unaware (0) 或 System DPI Aware (1) 将执行缩放。Qt High DPI Displays文章描述了这些模式,但显然不够清楚,所以我根据自己的经验告诉你。

您也可以根本不使用qt.conf或不使用dpiawareness属性,这也不会扩展 GUI。

谈到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 )在堆上做或分配应用程序对象。

于 2016-12-07T23:20:59.610 回答