【发布时间】:2021-08-17 06:55:49
【问题描述】:
我有多个QGraphicsItems,它们位于父子层次结构中。我试图在鼠标悬停时突出显示一个项目以在一个项目的基础上工作,这意味着如果鼠标悬停在一个项目上它应该突出显示。
突出显示效果很好,但如果我在孩子身上执行突出显示,那么突出显示也会自动发生在这样的父母身上,这是不希望的。这是问题的代码示例
from PySide2.QtCore import Qt
from PySide2.QtGui import QPen
from PySide2.QtWidgets import QGraphicsItem, \
QGraphicsScene, QGraphicsView, QGraphicsLineItem, QGraphicsSceneHoverEvent, \
QGraphicsRectItem, QMainWindow, QApplication
class TextBox(QGraphicsRectItem):
def __init__(self, parent: QGraphicsItem, x: float, y: float, width: float, height: float):
super().__init__(parent)
self.setParentItem(parent)
self.setAcceptHoverEvents(True)
pen = QPen(
Qt.white,
2,
Qt.SolidLine,
Qt.RoundCap,
Qt.RoundJoin
)
self.setPen(pen)
self.setRect(x, y, width, height)
def hoverEnterEvent(self, event: QGraphicsSceneHoverEvent):
super().hoverEnterEvent(event)
current_pen = self.pen()
current_pen.setWidth(5)
self.setPen(current_pen)
def hoverLeaveEvent(self, event: QGraphicsSceneHoverEvent):
super().hoverLeaveEvent(event)
current_pen = self.pen()
current_pen.setWidth(2)
self.setPen(current_pen)
class LineItem(QGraphicsLineItem):
def __init__(
self,
x1_pos: float,
x2_pos: float,
y1_pos: float,
y2_pos: float,
parent: QGraphicsItem = None
):
super().__init__()
self.setParentItem(parent)
self.setAcceptHoverEvents(True)
pen = QPen(
Qt.white,
2,
Qt.SolidLine,
Qt.RoundCap,
Qt.RoundJoin
)
self.setPen(pen)
self.setLine(
x1_pos,
y1_pos,
x2_pos,
y2_pos
)
def hoverEnterEvent(self, event: QGraphicsSceneHoverEvent):
super().hoverEnterEvent(event)
current_pen = self.pen()
current_pen.setWidth(5)
self.setPen(current_pen)
def hoverLeaveEvent(self, event: QGraphicsSceneHoverEvent):
super().hoverLeaveEvent(event)
current_pen = self.pen()
current_pen.setWidth(2)
self.setPen(current_pen)
class DiagramScene(QGraphicsScene):
def __init__(self, parent=None):
super().__init__(parent)
self.setBackgroundBrush(Qt.black)
line_item = LineItem(0, 200, 0, 0)
box = TextBox(line_item, 0, 0, 20, 20)
self.addItem(line_item)
class GraphicsView(QGraphicsView):
def __init__(self):
self.scene = DiagramScene()
super().__init__(self.scene)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setCentralWidget(GraphicsView())
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.setGeometry(100, 100, 800, 500)
mainWindow.show()
sys.exit(app.exec_())
将鼠标悬停在该行(即父行)上时,只有该行被突出显示。但是,当将鼠标悬停在矩形上时,两者都会突出显示。我认为这与矩形是订单项的子项有关。
我想保留父子层次结构,因为我必须根据父位置计算子位置,这样更容易。
有没有办法不将子项的突出显示级联到父项?
【问题讨论】:
标签: python python-3.x pyside2 qgraphicsitem