I have built a PyQt5, Python 3.7 windows application that uses PyQtGraph to view monochrome (greyscale) Magnetic Resonance DICOM images. As I move the mouse pointer over the image, I would like to display the value of the pixel under the pointer on the window. There is no obvious (to me) functionality in PyQtGraph to do this. I would be very grateful for any suggestions by more experienced developers of how to do this. Here is an edited code segment showing how I display the image (pixelArray) in an MDI subwindow.
layout = QVBoxLayout()
widget = QWidget()
widget.setLayout(layout)
self.subWindow.setWidget(widget)
imageViewer = pg.GraphicsLayoutWidget()
viewBox = imageViewer.addViewBox()
image= pg.ImageItem(border='w')
viewBox.addItem(image)
imageView = pg.ImageView(view=viewBox, imageItem=image)
layout.addWidget(imageView)
imageView.setImage(pixelArray)
--
You received this message because you are subscribed to the Google Groups "pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pyqtgraph+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pyqtgraph/cb625e45-ceb8-4227-a4bd-d5e8d3e38527%40googlegroups.com.
#!/usr/bin/env python3
import numpy as np
from PyQt5 import QtWidgets
import pyqtgraph as pg
#!/usr/bin/env python3
import numpy as np
from PyQt5 import QtWidgets
import pyqtgraph as pg
class TestImage(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
# Basic UI layout
self.statusbar = QtWidgets.QStatusBar(self)
self.setStatusBar(self.statusbar)
self.glw = pg.GraphicsLayoutWidget()
self.setCentralWidget(self.glw)
# Make image plot
self.p1 = self.glw.addPlot()
self.p1.getViewBox().setAspectLocked()
# Draw axes and ticks above image/data
[ self.p1.getAxis(ax).setZValue(10) for ax in self.p1.axes ]
self.data = np.random.rand(120, 100)
self.img = pg.ImageItem(self.data)
self.p1.addItem(self.img)
# Centre axis ticks on pixel
self.img.setPos(-0.5, -0.5)
# Swap commented lines to choose between hover or click events
self.p1.scene().sigMouseMoved.connect(self.mouseMovedEvent)
#self.p1.scene().sigMouseClicked.connect(self.mouseClickedEvent)
def mouseClickedEvent(self, event):
self.mouseMovedEvent(event.pos())
def mouseMovedEvent(self, pos):
# Check if event is inside image, and convert from screen/pixels to image xy indicies
if self.p1.sceneBoundingRect().contains(pos):
mousePoint = self.p1.getViewBox().mapSceneToView(pos)
x_i = round(mousePoint.x())
y_i = round(mousePoint.y())
if x_i > 0 and x_i < self.data.shape[0] and y_i > 0 and y_i < self.data.shape[1]:
self.statusbar.showMessage("({}, {}) = {:0.2f}".format(x_i, y_i, self.data[x_i, y_i]))
return
self.statusbar.clearMessage()
def main():
import sys
app = QtWidgets.QApplication(sys.argv)
mainwindow = TestImage()
mainwindow.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
if x_i > 0 and x_i < self . data . shape [ 0 ] and y_i > 0 and y_i < self . data . shape [ 1 ]:
self . statusbar . showMessage ( "({}, {}) = {:0.2f}" . format ( x_i , y_i , self . data [ x_i , y_i ]))
return
self . statusbar . clearMessage ()
def main ():
import sys
app = QtWidgets . QApplication ( sys . argv )
mainwindow = TestImage ()
mainwindow . show ()
sys . exit ( app . exec_ ())
if __name__ == '__main__' :
main ()
Patrick
On Wednesday, 19 February 2020 00:08:21 UTC+10:30, Stephen Shillitoe wrote:
I've tried to adapt the crosshair example to my code without success - I cannot get the mouse clicked event to fire. I think I must be missing something basic. Here is the code I have tried. I am new to pyqtgraph, so any suggestions would be gratefully received.
imageViewer = pg.GraphicsLayoutWidget()imageViewer.setMouseTracking( True)viewBox = imageViewer.addViewBox()imageViewer.scene(). sigMouseClicked.connect(self. getPixel)
#also tried, without success
#viewBox.proxy = pg.SignalProxy(viewBox.scene() .sigMouseClicked, rateLimit=60, slot=self.getPixel)
def getPixel(self, event):print('getPixel')print (str(event.pos().x()),str( event.pos().y()))event.accept()
On Monday, February 17, 2020 at 3:19:11 PM UTC, Stephen Shillitoe wrote:
I have built a PyQt5, Python 3.7 windows application that uses PyQtGraph to view monochrome (greyscale) Magnetic Resonance DICOM images. As I move the mouse pointer over the image, I would like to display the value of the pixel under the pointer on the window. There is no obvious (to me) functionality in PyQtGraph to do this. I would be very grateful for any suggestions by more experienced developers of how to do this. Here is an edited code segment showing how I display the image (pixelArray) in an MDI subwindow.
layout = QVBoxLayout() widget = QWidget() widget.setLayout(layout) self.subWindow.setWidget(widget) imageViewer = pg.GraphicsLayoutWidget() viewBox = imageViewer.addViewBox() image= pg.ImageItem(border='w') viewBox.addItem(image) imageView = pg.ImageView(view=viewBox, imageItem=image) layout.addWidget(imageView) imageView.setImage(pixelArray)
--
You received this message because you are subscribed to the Google Groups "pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pyqtgraph+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pyqtgraph/ab245d06-cab5-463d-bcf8-4dab3cadc8a8%40googlegroups.com.
imv.getView().scene().sigMouseMoved.connect(lambda pos: self.getPixel(pos, imv, pixelArray))
# ...
def getPixel(self, pos, imv, pixelArray):
# ...