2017-09-30 40 views
1

私のアプリケーションでは、ユーザーがマウスボタンをクリックしてアイテムにカーソルを合わせることでアイテムの色を変更できるQGraphicsSceneがあります。以下はPyQtをクリックしている間のホバーイベント

私は別の質問から借りサンプルコードです:だから

PyQt: hover and click events for graphicscene ellipse

from PyQt5 import QtGui, QtCore, QtWidgets 

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

     self.setScene(QtWidgets.QGraphicsScene()) 

     # add some items 
     x = 0 
     y = 0 
     w = 15 
     h = 15 
     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(3): 
      for yi in range(3): 
       item = callbackRect(x+xi*30, y+yi*30, w, h) 
       item.setAcceptHoverEvents(True) 
       item.setPen(pen) 
       item.setBrush(brush) 
       self.scene().addItem(item) 
       item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable) 

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

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

     return QtWidgets.QGraphicsRectItem.mouseReleaseEvent(self, event) 

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

    def hoverEnterEvent(self, event): 
     color = QtGui.QColor(0, 174, 185) 
     brush = QtGui.QBrush(color) 
     QtWidgets.QGraphicsRectItem.setBrush(self, brush) 

    def hoverLeaveEvent(self, event): 
     color = QtGui.QColor(QtCore.Qt.green) 
     brush = QtGui.QBrush(color.darker(150)) 
     QtWidgets.QGraphicsRectItem.setBrush(self, brush) 

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

、押されていない状態でマウスボタンがない場合、このコードでホバリングメソッドのみが呼び出されます。ドキュメンテーション(PySideの場合)に記載されているように、mousePressEventは、「マウスイベントを受け取るグラフィックスアイテムを決定します」。何らかの方法で他のアイテムのマウスイベントをブロックします。

https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/PySide/QtGui/QGraphicsItem.html?highlight=graphicsitem#PySide.QtGui.PySide.QtGui.QGraphicsItem.mouseMoveEvent

しかし、同時にマウスボタンを押したまま、別の項目のホバーイベントを呼び出す方法はありますか?

+0

は、より良い説明、あなたの説明が混乱して、アイテムが押されたときに、マウスがアイテムを推移されたときにそれが起こるしたいです – eyllanesc

+0

だから、アイテムの横の位置をクリックしたいと思って、その上にカーソルを移動している間に(マウスのボタンをクリックしても)このアイテムのホバーイベントがトリガーされます。 –

+0

私はあなたが望む出来事を理解しています、起こったときにどんな仕事をしたいですか? – eyllanesc

答えて

1

問題は複雑になるイベントの組み合わせであり、mouseMoveEventイベントを伝播できますが、ホバーイベントでは同じことをすることはできません。簡単な解決策は、以下に示すような方法QGraphicsViewmouseMoveEventのロジックを実装することです:

class MyFrame(QtWidgets.QGraphicsView): 
    def __init__(self, parent = None): 
     super(MyFrame, self).__init__(parent)  
     self.setScene(QtWidgets.QGraphicsScene()) 
     [...] 

    itemsSelected = [] 
    def mouseMoveEvent(self, event): 
     QtWidgets.QGraphicsView.mouseMoveEvent(self, event) 
     items = self.items(event.pos())#, QtGui.QTransform()) 
     for item in self.itemsSelected: 
      if item in items: 
       item.enterColor() 
      else: 
       item.leaveColor() 
     self.itemsSelected = items 

class callbackRect(QtWidgets.QGraphicsRectItem): 
    ''' 
    Rectangle call-back class. 
    ''' 
    def enterColor(self): 
     color = QtGui.QColor(0, 174, 185) 
     brush = QtGui.QBrush(color) 
     QtWidgets.QGraphicsRectItem.setBrush(self, brush) 

    def leaveColor(self): 
     color = QtGui.QColor(QtCore.Qt.green) 
     brush = QtGui.QBrush(color.darker(150)) 
     QtWidgets.QGraphicsRectItem.setBrush(self, brush) 

    def hoverEnterEvent(self, event): 
     self.enterColor() 

    def hoverLeaveEvent(self, event): 
     self.leaveColor() 
+0

私はこのアイデアを理解しており、おそらくそれが正しい方法です。しかし、このコードを単にサンプルコードにコピーしても、実際には何も行われません。クリックしてアイテムの上にマウスを置くと、何も起こりません。 –

+0

あなたが応答しないので、私は自分の答えを更新することを忘れてしまいます。最後の答えは私の答えとあなたの答えの和です。もう一度試してみてください。 :P – eyllanesc

関連する問題