Python 如何阻止显示分辨率影响pyqtgraph绘图中的轴

Python 如何阻止显示分辨率影响pyqtgraph绘图中的轴,python,plot,pyqt5,screen-resolution,pyqtgraph,Python,Plot,Pyqt5,Screen Resolution,Pyqtgraph,我正在使用pyqtgraph绘制一些数据,并注意到当我将绘图从笔记本电脑屏幕移动到第二台显示器时,绘图的缩放会受到影响: 笔记本电脑显示器: 外部监视器: 请注意,轴被“压缩”,并且绘图在第二个监视器上不再正确缩放 我发现其他人在网上报告类似的问题,但找不到任何真正的解决办法。建议的一个解决方案是使监视器的分辨率相同。我不喜欢这个解决方案,因为我不得不牺牲笔记本电脑的分辨率来适应我的低分辨率外部显示器 我发现的另一个解决方案是在如下所示实例化Qapplication之前,将行app.setA

我正在使用pyqtgraph绘制一些数据,并注意到当我将绘图从笔记本电脑屏幕移动到第二台显示器时,绘图的缩放会受到影响:

笔记本电脑显示器:

外部监视器:

请注意,轴被“压缩”,并且绘图在第二个监视器上不再正确缩放

我发现其他人在网上报告类似的问题,但找不到任何真正的解决办法。建议的一个解决方案是使监视器的分辨率相同。我不喜欢这个解决方案,因为我不得不牺牲笔记本电脑的分辨率来适应我的低分辨率外部显示器

我发现的另一个解决方案是在如下所示实例化Qapplication之前,将行
app.setAttribute(QtCore.Qt.AA_Use96Dpi)
添加到主循环中,以使Qt忽略操作系统的DPI设置:

def main():
 import sys
 app = QtWidgets.QApplication(sys.argv)
 app.setAttribute(QtCore.Qt.AA_Use96Dpi)
 MainWindow =GraphWindow()
 MainWindow.show()
 sys.exit(app.exec_())
这在一开始似乎是可行的,因为绘制的数据在轴上正确缩放。然而,它似乎并不真正起作用——添加这条线影响了笔记本电脑上轴的缩放,如下所示(相同的数据现在绘制在x轴上跨度为0到7000的轴上,在Yaxis上跨度为-2到-26dB的轴上):

,

但是,当将绘图移到第二台显示器上,使其看起来像上面显示的第一台“原始”笔记本电脑绘图时,确实“修复”了该问题

这尤其令人担忧,因为在笔记本电脑输出的情况下,在
app.setAttribute(QtCore.Qt.AA_Use96Dpi)
指令“看起来”正确,但歪曲了实际数据。如果我第一次绘制数据时包含了这条说明,我可能很容易就错过了

无论操作系统的DPI设置和监视器分辨率如何,让绘图准确显示的正确方法是什么?非常奇怪的是,绘制的数据似乎与轴值无关

这是一个最小的可重复样品:

from PyQt5 import QtWidgets, QtCore
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg
import sys  # We need sys so that we can pass argv to QApplication
import os
from  numpy.random import seed
from  numpy.random import randint

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.graphWidget = pg.PlotWidget()
        self.setCentralWidget(self.graphWidget)

        x = [1,2,3,4,5,6,7,8,9,10]
        seed(1)
        y = randint(5,35,10)

        # plot data: x, y values
        self.graphWidget.plot(x, y)


def main():
    app = QtWidgets.QApplication(sys.argv)
    app.setAttribute(QtCore.Qt.AA_Use96Dpi)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

可以在这里找到答案:

此问题的快速摘要: 解决这个问题基本上有两种方法

  • 让你的应用程序能够感知DPI(由Androwei提供)
  • 导入ctypes
    导入平台
    def make_dpi_aware():
    如果int(platform.release())>=8:
    ctypes.windell.shcore.setProcessdPiaware(True)
    #在“app=qtwidts.QApplication(sys.argv)”之前添加此代码
    使dpi了解()
    
  • Qt.HighDpiScaleFactorRoundingPolicy
    设置为
    PassThrough
    (by和ybarry)
  • #在“app=qtwidts.QApplication(sys.argv)”之前添加此代码
    qtwidts.QApplication.setAttribute(QtCore.Qt.highdpiscalefactorroundpolicy.PassThrough)
    
    我两个都试过了,它们都很好用!感谢这些贡献者。希望你能发现这也很有用