PyQt:悬停和点击事件的图形椭圆

问题描述:

我想知道用户是否悬停或点击一个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'.

您可以定义自己的椭圆形类和替换点击和悬停事件:

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