忽略鼠标拖过 QGraphicsObject
Ignore mouse drag over a QGraphicsObject
我有一个简单的 QRectF,我把它放在一个继承自 QGraphicsObject 的 class 中。我想让这个矩形的区域通过鼠标拖动事件。即现在,我点击并拖动移动了矩形。但是,我需要将该事件发送到我需要 select 多个项目的后台(默认情况下是可能的)。设置属性 WA_TransparentForMouseEvents 似乎很适合这个,但据我了解,这仅适用于 QWidget。
class GraphicsItem(QtWidgets.QGraphicsObject):
def __init__(self):
self._box = QtCore.QRectF(0, 0, 100, 100)
def mouseMoveEvent(self, event):
if (self._box.contains(event.pos()):
# set event transparency here
这可能吗?
谢谢
您可以为您的商品定义 QGraphicsItem.shape()
。我不知道您的 GraphicsItem 是什么样子,但这是一个一般示例。可以从 self._box
区域内选择其他项目。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class GraphicsItem(QGraphicsObject):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._box = QRectF(0, 0, 100, 100)
self.setFlags(self.ItemIsSelectable | self.ItemIsMovable)
def boundingRect(self):
return QRectF(-100, -50, 300, 200)
def shape(self):
area = QPainterPath()
area.addRect(self.boundingRect())
box = QPainterPath()
box.addRect(self._box)
return area - box
def paint(self, painter, *args):
painter.setBrush(QColor(0, 255, 0, 180))
painter.drawPath(self.shape())
if __name__ == '__main__':
app = QApplication(sys.argv)
scene = QGraphicsScene(-200, -150, 500, 400)
rect = scene.addRect(30, 30, 30, 30, Qt.black, Qt.red)
rect.setFlags(rect.ItemIsSelectable | rect.ItemIsMovable)
scene.addItem(GraphicsItem())
view = QGraphicsView(scene)
view.show()
sys.exit(app.exec_())
或者如果您特别想重新实现鼠标事件处理程序:
def mousePressEvent(self, event):
event.ignore() if event.pos() in self._box else super().mousePressEvent(event)
我有一个简单的 QRectF,我把它放在一个继承自 QGraphicsObject 的 class 中。我想让这个矩形的区域通过鼠标拖动事件。即现在,我点击并拖动移动了矩形。但是,我需要将该事件发送到我需要 select 多个项目的后台(默认情况下是可能的)。设置属性 WA_TransparentForMouseEvents 似乎很适合这个,但据我了解,这仅适用于 QWidget。
class GraphicsItem(QtWidgets.QGraphicsObject):
def __init__(self):
self._box = QtCore.QRectF(0, 0, 100, 100)
def mouseMoveEvent(self, event):
if (self._box.contains(event.pos()):
# set event transparency here
这可能吗? 谢谢
您可以为您的商品定义 QGraphicsItem.shape()
。我不知道您的 GraphicsItem 是什么样子,但这是一个一般示例。可以从 self._box
区域内选择其他项目。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class GraphicsItem(QGraphicsObject):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._box = QRectF(0, 0, 100, 100)
self.setFlags(self.ItemIsSelectable | self.ItemIsMovable)
def boundingRect(self):
return QRectF(-100, -50, 300, 200)
def shape(self):
area = QPainterPath()
area.addRect(self.boundingRect())
box = QPainterPath()
box.addRect(self._box)
return area - box
def paint(self, painter, *args):
painter.setBrush(QColor(0, 255, 0, 180))
painter.drawPath(self.shape())
if __name__ == '__main__':
app = QApplication(sys.argv)
scene = QGraphicsScene(-200, -150, 500, 400)
rect = scene.addRect(30, 30, 30, 30, Qt.black, Qt.red)
rect.setFlags(rect.ItemIsSelectable | rect.ItemIsMovable)
scene.addItem(GraphicsItem())
view = QGraphicsView(scene)
view.show()
sys.exit(app.exec_())
或者如果您特别想重新实现鼠标事件处理程序:
def mousePressEvent(self, event):
event.ignore() if event.pos() in self._box else super().mousePressEvent(event)