如何暂时禁用Qt (5) 高dpi 缩放?

How to disable Qt (5) high-dpi scaling temporarily?

我知道我可以通过在创建 QApplication 实例之前调用 QApplication::setAttribute( Qt::AA_DisableHighDpiScaling ); 来禁用整个应用程序的 DPI 缩放。但是,是否可以设置 QPainter/QGraphicsScene/QGraphicsView 来忽略 DPI?

我希望我的应用程序中的所有小部件都正常运行。我只想在视图中绘制一个网格,没有 DPI 缩放。该设置修复了 网格 ,但它阻止了小部件缩放。

注意:我不能轻易破坏图形项目的比例,因为我不知道确切的 DPI。我无法在任何地方找到一个值来准确解释 QPainter 的绘制方式。好像还蛮神奇的。我也不想尝试这样做,因为仅仅添加其他因素可能会导致数值不稳定。我想暂时删除一个因素...

简短的回答是否定的; high-dpi 处理是全有或全无。

对于您使用 QPainter 自己绘制的东西,有几个有效的解决方法。第一种是应用逆缩放。我不会太担心这里的数字不稳定;实际上,QPainter 最终在内部进行了统一转换。所以像这样:

QPainter p(myWidget);
qreal inverseDPR = 1.0 / myWidget->devicePixelRatio();
p.scale(inverseDPR, inverseDPR);

第二种方式是先渲染成QImage,默认DPR==1。然后在将图像绘制到小部件之前,将图像的 DPR 设置为小部件的 DPR。这样一来,就可以避免图像在绘画过程中被缩放。像这样:

QImage img(...);
// ... paint into image
img.setDevicePixelRatio(myWidget->devicePixelRatio());
QPainter p(myWidget);
p.drawImage(... image ...);