Как обновить данные изображения pyqtgraph при масштабировании, переводе, изменении размера

Я использую PySide. Внутри QMainWindow у меня есть ImageItem, отображаемый внутри PlotWidget.

Предположим, что у меня есть функция generateImage(r, np), которая может динамически генерировать изображение. Функция возвращает массив пикселей np x np для изображения, расположенного внутри квадрата (-r, -r)-(r, r) (в реальных координатах). Я хочу, чтобы ось отображала реальные координаты, а не пиксельные координаты.

  • Если я увеличиваю/уменьшаю масштаб, я хотел бы генерировать одинаковое количество пикселей, но в пределах меньшего/большего квадрата (в реальных координатах);
  • Если я переводю изображение, мне нужно сгенерировать изображение с большим квадратом и большим количеством пикселей, чтобы отобразить область interrest с использованием того же разрешения;
  • Если я изменил размер окна, мне нужно создать другое количество пикселей, чтобы сохранить разрешение отображаемого изображения тем же самым.

Код, который у меня на самом деле выглядит следующим образом:

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

Я предполагаю использовать сигнал 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))

Однако это не работает, потому что диапазон, возвращаемый сигналом, немного больше, чем r. Поэтому я вижу, что изображение становится все меньше и меньше...

  • Как определить количество пикселей, которые нужно заполнить в окне?
  • Как определить размер изображения, которое мне нужно создать (в реальных координатах)
  • Как обновить отображаемое без рекурсивного обновления диапазона изображений?
  • Как отображать только часть сгенерированного изображения? Нужно ли обрезать массив, прежде чем передавать его в setImage(), или я могу дать весь массив и позволить pyqtgraph отображать только область, в которой я нуждаюсь?
  • В более общем смысле, какова связь между координатами разных элементов и преобразованиями (graph.viewRect(), image.viewRect(), image.boundingRect(), image.sceneBoundingRect(),...)