Sorry it took so long to get back to you.

Thanks this makes a lot of sense!  What helped the most was the hoverEvent 
example you provided - event.acceptClicks and event.acceptDrags basically 
determines whether handling of the event happens in this level (i.e. the 
subclass of ImageItem) versus the original ImageItem or higher in the 
hierarchy?


I have another related question - what about overriding keypress behavior?  
Should it be done all the way on the GraphicsWindow level (like had been 
suggested 
https://stackoverflow.com/questions/40423999/pyqtgraph-where-to-find-signal-for-key-preses),
 
or can I also subclass something like ViewBox?

Obviously adding a keyPressEvent to ImageItem didn't do anything (because 
there is no scene object?) but when I try to subclass ViewBox just adding a 
print(ev.key()) to keyPressEvent function I just get segmentation faults.

Thanks again so much for your help



On Thursday, May 17, 2018 at 11:58:02 PM UTC-4, Luke Campagnola wrote:
>
> Regarding the use of scene events: you just need to map the position of 
> the event to the coordinate system of your ImageItem, like:
>
>     image_pos = image_item.mapFromScene(event.scenePos())
>
> If this makes no sense at all, then I recommend reading about Qt 
> GraphicsView and how it handles coordinate system (
> http://doc.qt.io/archives/qt-4.8/graphicsview.html).
>
> All that said, *probably* catching events directly from the ImageItem is 
> the best way to go for your purpose. This requires creating a subclass of 
> ImageItem that reimplements the methods mouseClickEvent, mouseDragEvent, 
> and hoverEvent:
>
>     import pyqtgraph as pg
>
>
>     class DrawingImage(pg.ImageItem):
>         def mouseClickEvent(self, event):
>             print("Click", event.pos())
>
>         def mouseDragEvent(self, event):
>             if event.isStart():
>                 print("Start drag", event.pos())
>             elif event.isFinish():
>                 print("Stop drag", event.pos())
>             else:
>                 print("Drag", event.pos())
>
>         def hoverEvent(self, event):
>             if not event.isExit():
>                 # the mouse is hovering over the image; make sure no other 
> items
>                 # will receive left click/drag events from here. 
>                 event.acceptDrags(pg.QtCore.Qt.LeftButton)
>                 event.acceptClicks(pg.QtCore.Qt.LeftButton)
>
>
>     img = DrawingImage(pg.np.random.normal(size=(100, 150)), 
> axisOrder='row-major')
>     view = pg.plot()
>     view.addItem(img)
>
> In the example above, event.pos() is already expressed in the coordinate 
> system of the image, so no mapping is necessary.
> Also note that because we are capturing left-drag events, you won't be 
> able to pan the view using the left mouse button, but middle-drag will 
> still work.
>
>
> On Thu, May 17, 2018 at 9:35 AM, Talia Weiss <[email protected] 
> <javascript:>> wrote:
>
>> Hi all,
>>
>> I'm trying to write some code that will allow me to paint on an image in 
>> different colors and I'm very confused about how to go about it.  ImageItem 
>> does implement a small drawing example but as I want to extend the 
>> functionality further the ImageItem-draw example script has been of little 
>> help.
>>
>> Basically I need access to mouse click and mouse drag events on an 
>> imageItem.  I thought that grabbing the scene and connecting 
>> sigMouseClicked would give me access to that, but I have no idea how to 
>> interpret either the evt.pos() or evt.scenePos() points it returns.  I have 
>> an ImageItem inside a PlotItem so I have axes for the image, and the points 
>> returned do not correspond at all to where I am clicking.
>>
>> I've additionally tried to make a new class inheriting ImageItem, but 
>> overwriting the mouseClick and mouseDrag events don't seem to work. 
>>
>> I'm overall very confused about where the mousedrag and mouseclick events 
>> for things like dragging and scaling the scene are even handled?  It 
>> doesn't seem to be in pg.GraphicsItem/etc.  This is important because I 
>> want to be able to paint on an image and drag it still (maybe by 
>> shift-dragging instead of just dragging, which would draw to the screen)?
>>
>> Any advice or insight anyone could give me on this would be greatly 
>> appreciated.
>>
>> Example code:  
>> def paintOn(evt):
>>     global img
>>     pos = evt.pos()
>>     if evt.button() == QtCore.Qt.LeftButton:
>>         x, y = (int(pos.x()), int(pos.y()))
>>         print(pos)
>>         print(evt.scenePos())
>>         w, h, _ = img.image.shape
>>         #x = x - h
>>         #y = y-h
>>         imcopy = img.image.copy()
>>         imcopy[y-10:y+10, x-10:x+10, :] = [255, 255, 255]
>>         img.setImage(imcopy, autoLevels=False)
>>
>> # Interpret image data as row-major instead of row-major
>> pg.setConfigOptions(imageAxisOrder='row-major')
>>
>> app = pg.mkQApp() #alias for QtGui.QApplication([])
>>
>> ## Create window with ImageView widget
>> win = pg.GraphicsLayoutWidget()
>> win.setWindowTitle('Watershed')
>> win.show()
>>
>> ## Add a PlotItem
>> p1 = win.addPlot()
>> # an ImageItem then goes in the viewbox to display an image
>> img = pg.ImageItem()
>> p1.addItem(img)
>>
>> ## Initially display the first frame
>> img.setImage(np.zeros((100, 100, 3)))
>> ## make the image the correct orientation
>> ## only have to do this once
>> img.getViewBox().invertY(True)
>>
>>
>> #get the scene of the imag
>> sc = img.scene()
>> sc.sigMouseClicked.connect(paintOn)
>>
>> -- 
>> 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 [email protected] <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/pyqtgraph/c14ef223-1051-4c18-b124-39ca1c104d69%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/pyqtgraph/c14ef223-1051-4c18-b124-39ca1c104d69%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyqtgraph/1e23ac4d-ae7e-45db-a059-26649e6c094e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to