如何在缩放,平移,调整大小时更新pyqtgraph图像数据

Cha*_*net 12 pyqtgraph

我正在使用PySide.在里面QMainWindow,我有一个ImageItem显示在里面PlotWidget.

假设我有一个generateImage(r, np)可以动态生成图像的功能.该函数为位于正方形内的图像(实际坐标)返回npx np像素数组(-r, -r)-(r, r).我希望轴显示真实坐标,而不是像素坐标.

  1. 如果我放大/缩小,我想生成相同数量的像素,但是在更小/更大的正方形内(在实际坐标中);
  2. 如果我翻译图像,我需要生成一个更大的正方形和更多像素的图像,以使用相同的分辨率显示interrest区域;
  3. 如果我调整窗口大小,我需要生成不同数量的像素,以保持显示图像的分辨率相同.

我的代码实际上是这样的:

graph = PlotWidget()
image = ImageItem()
graph.addItem(image)
graph.setAspectLocked(True)  # to keep the pixels square

r = 10e-6  # 10 µm
np = 101  # but should be related to number of pixels in the window
image.setImage(generateImage(r, np))
image.setRect(QRectF(-r, -r, 2*r, 2*r))
Run Code Online (Sandbox Code Playgroud)

我的猜测是使用sigRangeChanged信号来检测视图中的变化.但是,我不确定如何检测窗口的大小和分辨率,以及如何正确更新图像.

我天真地尝试做这样的事情:

graph.sigRangeChanged.connect(updateRange)

def updateRange(view, rng):
    r = max(abs(rng[0][0]), abs(rng[0][1]),
            abs(rng[1][0]), abs(rng[1][1]))
    image.setImage(generateImage(r, np))
    image.setRect(QRectF(-r, -r, 2*r, 2*r))
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用,因为信号返回的范围略大于r自身.因此,我看到图像变得越来越小......

  • 如何确定填充窗口所需的像素数?
  • 如何确定需要生成的图像大小(以实际坐标为单位)
  • 如何在不递归更新图像范围的情况下更新显示的内容?
  • 如何仅显示生成图像的一部分?我是否需要在给出之前对数组进行切片setImage(),或者我可以给出整个数组并让pyqtgraph只显示我需要的区域吗?
  • 更一般地,什么是不同的元素和转换的坐标之间的关系(graph.viewRect(),image.viewRect(),image.boundingRect(),image.sceneBoundingRect(),...)