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_()
答
您可以定义自己的椭圆形类和替换点击和悬停事件:
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)
希望它能帮助!
谢谢!这非常有用。不幸的是,当我将它与我的代码整合在一起时,它编译/解释得很好,但是当我鼠标悬停或单击椭圆项目时没有任何反应。似乎MyEllipse类没有从图形视图 - >图形场景接收信号。有任何想法吗? –
好的,我把它连接好了。不幸的是,我试图在for循环中创建椭圆,并且似乎只有最后创建的对象才能接收事件调用。有任何想法吗? (我用代码更新了这个问题)。 –
'item.setFlag(QtGui.QGraphicsItem.ItemIsMovable)'应该在'addItem'之前进入for循环。否则只有最后一个项目是可移动的! – cdonts