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_()
謝謝!這非常有用。不幸的是,當我將它與我的代碼整合在一起時,它編譯/解釋得很好,但是當我鼠標懸停或單擊橢圓項目時沒有任何反應。似乎MyEllipse類沒有從圖形視圖 - >圖形場景接收信號。有任何想法嗎? –
好的,我把它連接好了。不幸的是,我試圖在for循環中創建橢圓,並且似乎只有最後創建的對象才能接收事件調用。有任何想法嗎? (我用代碼更新了這個問題)。 –
'item.setFlag(QtGui.QGraphicsItem.ItemIsMovable)'應該在'addItem'之前進入for循環。否則只有最後一個項目是可移動的! – cdonts