You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.0 KiB

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)