[PyQt] Hover Event for a QGraphicsItem

sw33tz nyavuz.nm20 at gmail.com
Sun May 8 14:20:21 BST 2016


So I rewrote what you suggested but I'm still not being able to detect the
hover event...why is this working?

*class graphics**_Object*(QtGui.QGraphicsPixmapItem):
    *def *__init__(self, parent=None):
        super(graphics_Object, self).__init__(parent)
        pixmap = QtGui.QPixmap("switch.png").scaled(40, 40,
QtCore.Qt.KeepAspectRatio)
        self.setPixmap(pixmap)
        self.setFlag(QtGui.QGraphicsPixmapItem.ItemIsSelectable)
        self.setFlag(QtGui.QGraphicsPixmapItem.ItemIsMovable)
        self.setAcceptHoverEvents(True)
        self.switch_LinkedWithItems = []
        self.switch_mininet_name = ''

    *def **hoverEnterEvent*(self, event):
        *print *'hello'

    *def **hoverLeaveEvent*(self, event):
        *print *'goodbye'

*class **graphicsScene*(QtGui.QGraphicsScene):
    *def *__init__(self, parent=None):
        super(graphicsScene, self).__init__(parent)

    *def **mousePressEvent*(self, event):
        self.graphics_item = graphics_Object()

    *def **mouseReleaseEvent*(self, event)
        self.addItem(self.graphics_item.graphics_pixItem)
        self.graphics_item.setPos(event.scenePos())


*class **Form*(QtGui.QMainWindow):
    *def *__init__(self):
        super(Form, self).__init__()
        self.ui = uic.loadUi('form.ui')

        self.scene = graphicsScene()
        self.setMouseTracking(True)




On Sun, May 8, 2016 at 1:54 PM, Elvis Stansvik [via Python] <
ml-node+s6n5190318h69 at n6.nabble.com> wrote:

> 2016-05-07 23:05 GMT+02:00 sw33tz <[hidden email]
> <http:///user/SendEmail.jtp?type=node&node=5190318&i=0>>:
> > Thanks for replying...I've updated my code but I still cant get it to
> work:
>
> I've now had a closer look at your code. There are several problems
> with which I point out inline below.
>
> >
> > class graphics_Object(QtGui.QGraphicsPixmapItem):
> >     def __init__(self, parent=None):
> >         super(switch_Object, self).__init__(parent)
>
> This, as I already mentioned, should be graphics_Object and not
> graphics_Object in the call to super(..).
>
> >         pixmap = QtGui.QPixmap("item.png")
> >         self.graphics_pixItem =
> QtGui.QGraphicsPixmapItem(pixmap.scaled(40,
> > 40, QtCore.Qt.KeepAspectRatio))
> >
> >
> self.graphics_pixItem.setFlag(QtGui.QGraphicsPixmapItem.ItemIsSelectable)
> >
> > self.graphics_pixItem.setFlag(QtGui.QGraphicsPixmapItem.ItemIsMovable)
> >         self.graphics_pixItem.setAcceptHoverEvents(True)
> >
> >
> >     def hoverEnterEvent(self, event):
> >         print 'hello'
>
> Here's your real problem, you are overriding hoverEnterEvent in the
> graphics_Object class, but the item that you are later adding to the
> scene is self.graphics_pixItem, which is of type
> QtGui.QGraphicsPixmapItem.
>
> >
> > class graphicsScene(QtGui.QGraphicsScene):
> >     def __init__(self, parent=None):
> >         super(graphicsScene, self).__init__(parent)
> >
> >     def mousePressEvent(self, event):
> >         self.graphics_item = graphics_Object()
> >     def mouseReleaseEvent(self, event)
>
> There's a missing ':' above.
>
> >         self.addItem(self.self.graphics_item.graphics_pixItem)
>
> Apart from "self.self" which makes no sense (it should be just
> "self.graphics_item"), here you are adding graphics_pixItem to the
> scene, which is of type QtGui.QGraphicsPixmapItem, not of type
> graphics_Object.
>
> You seem to have a misunderstanding of how inheritance vs composition
> works.
>
> >
> self.graphics_item.self.graphics_pixItem.setPos(event.scenePos())
>
> Here's again a strange use of "self" which will give an error. `self`
> is only available from within the class itself, the
> "self.graphics_item.self" here should be just "self.graphics_item".
>
> Here's roughly how I would structure the code, given what I've seen in
> your example (Python 2, PyQt 4, since I'm guessing that's what you
> use):
>
>
> main.py:
>
> from sys import argv, exit
>
> from PyQt4.QtGui import QApplication
> from PyQt4.QtGui import QGraphicsItem
> from PyQt4.QtGui import QGraphicsPixmapItem
> from PyQt4.QtGui import QGraphicsScene
> from PyQt4.QtGui import QMainWindow
> from PyQt4.QtGui import QPixmap
> from PyQt4.QtCore import Qt
> from PyQt4.uic import loadUi
>
>
> class Item(QGraphicsPixmapItem):
>
>     def __init__(self, parent=None):
>         super(Item, self).__init__(parent)
>
>         pixmap = QPixmap('item.png').scaled(40, 40, Qt.KeepAspectRatio)
>
>         self.setPixmap(pixmap)
>         self.setFlag(QGraphicsItem.ItemIsSelectable)
>         self.setFlag(QGraphicsItem.ItemIsMovable)
>         self.setAcceptHoverEvents(True)
>
>     def hoverEnterEvent(self, event):
>         print('hover enter')  # Do whatever you need to do here
>
>     def hoverLeaveEvent(self, event):
>         print('hover leave')  # Do whatever you need to do here
>
>
> class Scene(QGraphicsScene):
>
>     def __init__(self, parent=None):
>         super(Scene, self).__init__(parent)
>
>     def mouseReleaseEvent(self, event):
>         item = Item()
>         item.setPos(event.scenePos())
>         self.addItem(item)
>
>
> class Window(QMainWindow):
>
>     def __init__(self, parent=None):
>         super(Window, self).__init__(parent)
>
>         loadUi('window.ui'), self)
>
>         self.scene = Scene(self)
>         self.view.setScene(self.scene)
>
>
> app = None
>
>
> def main():
>     global app
>
>     app = QApplication(argv)
>
>     window = Window()
>     window.show()
>
>     exit(app.exec_())
>
>
> if __name__ == '__main__':
>     main()
>
>
> window.ui:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <ui version="4.0">
>  <class>Window</class>
>  <widget class="QMainWindow" name="Window">
>   <property name="geometry">
>    <rect>
>     <x>0</x>
>     <y>0</y>
>     <width>800</width>
>     <height>600</height>
>    </rect>
>   </property>
>   <property name="windowTitle">
>    <string>MainWindow</string>
>   </property>
>   <widget class="QWidget" name="centralwidget">
>    <layout class="QVBoxLayout" name="verticalLayout">
>     <item>
>      <widget class="QGraphicsView" name="view"/>
>     </item>
>    </layout>
>   </widget>
>  </widget>
>  <resources/>
>  <connections/>
> </ui>
>
>
> Hope you can use that as starting point / inspiration and figure out
> things from there.
>
> Elvis
>
> >
> > class Form(QtGui.QMainWindow):
> >     def __init__(self):
> >         super(Form, self).__init__()
> >         self.ui = uic.loadUi('form.ui')
> >
> >         self.scene = graphicsScene()
> >         self.ui.view.setScene(self.scene)
> >
> >         self.setMouseTracking(True)
> >
> >
> > On Sat, May 7, 2016 at 10:55 PM, Elvis Stansvik [via Python] <[hidden
> > email]> wrote:
> >>
> >> Hi Nesibe,
> >>
> >> 2016-05-07 19:46 GMT+02:00 sw33tz <[hidden email]>:
> >> > I want some small text to pop up when I have my curser over a
> >> > QGraphicsItem
> >> > in my QGraphicsScene. I have a class that inherits from
> QGraphicsItem,
> >> > and
> >> > this represents my graphical items in the scene.
> >> >
> >> > I tried using the QGraphicsItem.hoverEnterEvent and I also set the
> >> > setAcceptHoverEvents(True), but I still can't enable that hover
> event. I
> >> > also came across an event filter method but I'm not sure where to
> >> > implement
> >> > it.
> >>
> >> This seems to work here:
> >>
> >>
> >> test.py:
> >>
> >> from sys import argv, exit
> >>
> >> from PyQt5.QtCore import Qt
> >> from PyQt5.QtWidgets import QApplication
> >> from PyQt5.QtWidgets import QGraphicsEllipseItem
> >> from PyQt5.QtWidgets import QGraphicsScene
> >> from PyQt5.QtWidgets import QGraphicsView
> >> from PyQt5.QtWidgets import QMainWindow
> >>
> >>
> >> class MyItem(QGraphicsEllipseItem):
> >>
> >>     def __init__(self, parent=None):
> >>         super(MyItem, self).__init__(parent)
> >>
> >>         self.setRect(50, 50, 50, 50)
> >>         self.setBrush(Qt.red)
> >>         self.setAcceptHoverEvents(True)
> >>
> >>     def hoverEnterEvent(self, event):
> >>         print('hover enter')
> >>
> >>     def hoverLeaveEvent(self, event):
> >>         print('hover leave')
> >>
> >>
> >> app = None
> >>
> >>
> >> def main():
> >>     global app
> >>
> >>     app = QApplication(argv)
> >>
> >>     scene = QGraphicsScene()
> >>     scene.addItem(MyItem())
> >>
> >>     view = QGraphicsView()
> >>     view.setScene(scene)
> >>
> >>     window = QMainWindow()
> >>     window.setCentralWidget(view)
> >>     window.show()
> >>
> >>     exit(app.exec_())
> >>
> >>
> >> if __name__ == '__main__':
> >>     main()
> >>
> >>
> >> Hope that helps.
> >>
> >> Best regards,
> >> Elvis
> >>
> >> >
> >> > Should I install the event filter in the QGraphicsItem class, or the
> >> > scene?
> >> > I tried both and I'm still not getting the desired result. I want to
> be
> >> > able
> >> > to hover over all the items in the scene.
> >> >
> >> >
> >> > class HoverEventFilter(QtCore.QObject):
> >> >     def eventFilter(self, receiver, event):
> >> >         if (event.type() == QtCore.QEvent.HoverEnter):
> >> >             # this is for test purposes
> >> >             print 'hover event'
> >> >             return True
> >> >         else:
> >> >             # Call Base Class Method to Continue Normal Event
> Processing
> >> >             return super(HoverEventFilter,
> self).eventFilter(receiver,
> >> > event)
> >> >
> >> >
> >> >
> >> > --
> >> > View this message in context:
> >> >
> http://python.6.x6.nabble.com/Hover-Event-for-a-QGraphicsItem-tp5190283.html
> >> > Sent from the PyQt mailing list archive at Nabble.com.
> >> > _______________________________________________
> >> > PyQt mailing list    [hidden email]
> >> > https://www.riverbankcomputing.com/mailman/listinfo/pyqt
> >> _______________________________________________
> >> PyQt mailing list    [hidden email]
> >> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
> >>
> >> ________________________________
> >> If you reply to this email, your message will be added to the
> discussion
> >> below:
> >>
> >>
> http://python.6.x6.nabble.com/Hover-Event-for-a-QGraphicsItem-tp5190283p5190286.html
> >> To unsubscribe from Hover Event for a QGraphicsItem, click here.
> >> NAML
> >
> >
> >
> > ________________________________
> > View this message in context: Re: Hover Event for a QGraphicsItem
> >
> > Sent from the PyQt mailing list archive at Nabble.com.
> >
> > _______________________________________________
> > PyQt mailing list    [hidden email]
> <http:///user/SendEmail.jtp?type=node&node=5190318&i=1>
> > https://www.riverbankcomputing.com/mailman/listinfo/pyqt
> _______________________________________________
> PyQt mailing list    [hidden email]
> <http:///user/SendEmail.jtp?type=node&node=5190318&i=2>
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
>
> ------------------------------
> If you reply to this email, your message will be added to the discussion
> below:
>
> http://python.6.x6.nabble.com/Hover-Event-for-a-QGraphicsItem-tp5190283p5190318.html
> To unsubscribe from Hover Event for a QGraphicsItem, click here
> <http://python.6.x6.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5190283&code=bnlhdnV6Lm5tMjBAZ21haWwuY29tfDUxOTAyODN8LTE2MTY4NDE4NTE=>
> .
> NAML
> <http://python.6.x6.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>




--
View this message in context: http://python.6.x6.nabble.com/Hover-Event-for-a-QGraphicsItem-tp5190283p5190329.html
Sent from the PyQt mailing list archive at Nabble.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20160508/99f92dc3/attachment-0001.html>


More information about the PyQt mailing list