2016-05-07 35 views
0

当我的光标在我的QGraphicsScene中的QGraphicsItem上时,我想要弹出一些小文本。我有一个继承自QGraphicsItem的类,它代表了我在场景中的图形项目。QGraphicsItem悬停事件(PyQt4)

我试过使用QGraphicsItem.hoverEnterEvent,我也设置了setAcceptHoverEvents(True),但我仍然无法启用该悬停事件。我也遇到了一个事件过滤器的方法,但我不知道在哪里实现它。

我应该在QGraphicsItem课程或场景中安装事件过滤器吗?我尝试了两种方法,但仍未获得理想的效果。我希望能够将鼠标悬停在场景中的所有项目上。

更新: 所以我尝试这样做,但悬停事件仍然没有被检测到。

class graphics_Object(QtGui.QGraphicsPixmapItem): 
    def __init__(self, parent=None): 
     super(graphics_Object, self).__init__(parent) 
     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' 

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.graphics_pixItem.setPos(event.scenePos()) 

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) 
+0

您是否继承'QGraphicsItem'?这是使用'hoverEnterEvent'的唯一方法。 'QGraphicsItem'不是'QObject',所以你不能在其上安装一个事件过滤器(虽然你可以将它的事件传递到*另一个*'QGraphicsItem'上,但我认为这对你没有帮助)。 –

+0

谢谢你的回应,我已经更新了我的代码,我尝试了继承QGraphicsPixmapItem,但悬停事件仍然没有被检测到 – neziy

+0

尝试将鼠标追踪放在graphicsview上,而不是主窗口 –

回答

0

里面你graphics_Object类您正在另一pixmapItem,graphics_Object已经graphicsPixmapItem的一个子类,所以我不认为这个目的。

然后,您只需将该嵌套的pixmapItem添加到场景中,并且您的hoverEnterEvent位于graphics_Object上,这永远不会添加到场景中。这就是为什么你没有收到悬停事件。

之一,是许多解决方案是只添加图形对象到现场,而不是嵌套graphicsPixmapItem并从PyQt的在graphics_Object

class graphics_Object(QtGui.QGraphicsPixmapItem): 
    def __init__(self, parent=None): 
    super(graphics_Object, self).__init__(parent) 
    pixmap = QtGui.QPixmap("item.png") 
    self.setPixmap(pixmap.scaled(40, 40, QtCore.Qt.KeepAspectRatio)) 
    self.setFlag(QtGui.QGraphicsPixmapItem.ItemIsSelectable) 
    self.setFlag(QtGui.QGraphicsPixmapItem.ItemIsMovable) 
    self.setAcceptHoverEvents(True) 

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


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): 
    print('adding to scene') 
    self.addItem(self.graphics_item) 
    self.graphics_item.setPos(event.scenePos()) 

的初始化使用setPixmap()当你继承(子类)类或python中的任何类,请将新类视为继承类的“副本”。除非覆盖方法,否则它的行为与基类完全相同,在这种情况下,我们重写“init”和“hoverEnterEvent”方法来完成我们的自定义内容。 QGraphicsPixmapItem的其他所有内容保持不变