from PySide6.QtCore import Qt, QRectF, Signal, QObject from PySide6.QtGui import QPainter, QPen, QColor, QFontMetricsF, QPainterPath from PySide6.QtWidgets import QGraphicsItem class RoundedRectangleItem(QGraphicsItem, QObject): selected = Signal(int) unselected = Signal(int) def __init__(self, x, y, text, id): QGraphicsItem.__init__(self) QObject.__init__(self) self.rect = QRectF(x, y, 70, 70) self.radius = 10 self.text = text self.id = id self.isSelected = False # 是否被选中 def boundingRect(self): return self.rect def shape(self): path = QPainterPath() path.addRoundedRect(self.rect, self.radius, self.radius) return path def paint(self, painter, option, widget): painter.setRenderHint(QPainter.Antialiasing) # 设置抗锯齿 pen = QPen(Qt.black) painter.setPen(pen) if self.isSelected: # 如果被选中,设置不同的填充颜色和边框样式 painter.setBrush(QColor(255, 0, 0, 255)) # 设置选中时的填充颜色 pen.setWidth(2) # 设置边框宽度 pen.setStyle(Qt.DashLine) # 设置虚线边框样式 painter.setPen(pen) else: painter.setBrush(QColor(0, 255, 0, 255)) # 设置默认的填充颜色 # 绘制圆角矩形 painter.drawRoundedRect(self.rect, self.radius, self.radius) # 计算文本的位置 font = painter.font() font.setPointSize(36) painter.setFont(font) metrics = QFontMetricsF(font) text_bounding_rect = metrics.boundingRect(str(self.text)) text_width = text_bounding_rect.width() text_height = text_bounding_rect.height() text_x = self.rect.center().x() - text_width / 2 text_y = self.rect.center().y() + text_height / 4 # 绘制文本 painter.drawText(text_x, text_y, str(self.text)) def mousePressEvent(self, event): # 鼠标点击时切换选中状态 self.isSelected = not self.isSelected self.update() # 发射选中信号 if self.isSelected: self.selected.emit(self.id) else: self.unselected.emit(self.id) super().mousePressEvent(event)