2016-05-07 85 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的其他所有內容保持不變