Я использую 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()
,...)