2016-01-06 55 views
1

我想知道用戶是否懸停或點擊一個GraphicsScene形狀對象(例如,我下面評論的橢圓形對象)。我是PyQt的新手,對於C++來說文檔比Python更好,所以我在處理這個問題時遇到了一些麻煩。PyQt:懸停和點擊事件的圖形橢圓

from PyQt4 import QtGui, QtCore 

class MyFrame(QtGui.QGraphicsView): 
    def __init__(self, parent = None): 
     super(MyFrame, self).__init__(parent) 

     self.setScene(QtGui.QGraphicsScene()) 

     # add some items 
     x = 0 
     y = 0 
     w = 45 
     h = 45 
     pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.green)) 
     brush = QtGui.QBrush(pen.color().darker(150)) 

     # i want a mouse over and mouse click event for this ellipse 
     item = self.scene().addEllipse(x, y, w, h, pen, brush) 


     item.setFlag(QtGui.QGraphicsItem.ItemIsMovable) 

if (__name__ == '__main__'): 
    app = QtGui.QApplication([]) 
    f = MyFrame() 
    f.show() 
    app.exec_() 

更新!

現在我可以根據鼠標點擊發布獲得一個事件。不幸的是,只有我創建的最後一個項目才能響應事件。這裏發生了什麼?

from PyQt4 import QtGui, QtCore 

class MyFrame(QtGui.QGraphicsView): 
    def __init__(self, parent = None): 
     super(MyFrame, self).__init__(parent) 

     self.setScene(QtGui.QGraphicsScene()) 

     # add some items 
     x = 0 
     y = 0 
     w = 20 
     h = 20 
     pen = QtGui.QPen(QtGui.QColor(QtCore.Qt.green)) 
     brush = QtGui.QBrush(pen.color().darker(150)) 

     # i want a mouse over and mouse click event for this ellipse 
     for xi in range(10): 
      for yi in range(10): 
       item = callbackRect(x+xi*30, y+yi*30, w, h) 
       item.setAcceptHoverEvents(True) 
       item.setPen(pen) 
       item.setBrush(brush) 
       self.scene().addItem(item) 

     # item = self.scene().addEllipse(x, y, w, h, pen, brush) 


     item.setFlag(QtGui.QGraphicsItem.ItemIsMovable) 

class callbackRect(QtGui.QGraphicsRectItem): 
    ''' 
    Rectangle call-back class. 
    ''' 

    def mouseReleaseEvent(self, event): 
     # recolor on click 
     color = QtGui.QColor(180, 174, 185) 
     brush = QtGui.QBrush(color) 
     QtGui.QGraphicsRectItem.setBrush(self, brush) 

     return QtGui.QGraphicsRectItem.mouseReleaseEvent(self, event) 

    def hoverMoveEvent(self, event): 
     # Do your stuff here. 
     pass 

if (__name__ == '__main__'): 
    app = QtGui.QApplication([]) 
    f = MyFrame() 
    f.show() 
    app.exec_() 

Screen shot of only last item created being 'eventable'.

回答

2

您可以定義自己的橢圓形類和替換點擊和懸停事件:

class MyEllipse(QtGui.QGraphicsEllipseItem): 

    def mouseReleaseEvent(self, event): 
     # Do your stuff here. 
     return QtGui.QGraphicsEllipseItem.mouseReleaseEvent(self, event) 

    def hoverMoveEvent(self, event): 
     # Do your stuff here. 
     pass 

用法:

item = MyEllipse(x, y, w, h) 
item.setAcceptHoverEvents(True) 
item.setPen(pen) 
item.setBrush(brush) 
self.scene().addItem(item) 

希望它能幫助!

+0

謝謝!這非常有用。不幸的是,當我將它與我的代碼整合在一起時,它編譯/解釋得很好,但是當我鼠標懸停或單擊橢圓項目時沒有任何反應。似乎MyEllipse類沒有從圖形視圖 - >圖形場景接收信號。有任何想法嗎? –

+0

好的,我把它連接好了。不幸的是,我試圖在for循環中創建橢圓,並且似乎只有最後創建的對象才能接收事件調用。有任何想法嗎? (我用代碼更新了這個問題)。 –

+0

'item.setFlag(QtGui.QGraphicsItem.ItemIsMovable)'應該在'addItem'之前進入for循環。否則只有最後一個項目是可移動的! – cdonts