[PyQt] Hover Event for a QGraphicsItem

sw33tz nyavuz.nm20 at gmail.com
Sun May 8 14:25:45 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 4:38 PM, Nesibe Yavuz <nyavuz.nm20 at gmail.com> wrote:

> By the way I'm not posting the entire code so sometimes I might forget to
> change the name of a variable or class but in my original code the format
> is written correctly.
>
> On Sun, May 8, 2016 at 4:34 PM, Nesibe Yavuz <nyavuz.nm20 at gmail.com>
> wrote:
>
>> 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-tp5190283p5190333.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/955c1f50/attachment-0001.html>


More information about the PyQt mailing list