c++ - 创建 QApplication 在 4k 显示器上以高 dpi 显示时调整父窗口(非 Qt 窗口)的大小

标签 c++ qt dpi qapplication

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

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

最佳答案

qt.conf中,我们应该为 DPI 感知设置使用一个值:

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

如果您想使用 qt.conf 设置的此 dpiawareness 并防止 Qt GUI 自动缩放,请使用值 2,即 Per Monitor DPI Aware,而不是由 Qt 处理。 “每个显示器 DPI 感知”用于允许系统在从一个显示器拖动到另一显示器时将事件向下发送到窗口。就像 GUI 应用程序将与自然 API 一起运行一样,无论是处理还是不处理 event 。在这种情况下,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 ) 或在堆上分配应用程序对象。

关于c++ - 创建 QApplication 在 4k 显示器上以高 dpi 显示时调整父窗口(非 Qt 窗口)的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41020054/

相关文章:

c++ - Boost图在子图中找到边

c++ - Qt QHBoxLayout 问题?

c++ - Qt 子目录包含类

c++ - QT QUdpSocket : No such file or directory

c++ - 为 QImage 设置 DPI

ios - 无法在 iOS 中找到图像的 DPI

windows - 在 Windows 8 上声明每个窗口的高 DPI 感知

c++ - C++模板重载调用

c++ - 不能在opencv C++中扭曲背面图像

c++ - 跨调试和发布配置的 Windows API 输出差异