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

11 months ago
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)
11 months ago
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 # 是否被选中
11 months ago
def boundingRect(self):
return self.rect
11 months ago
def shape(self):
path = QPainterPath()
path.addRoundedRect(self.rect, self.radius, self.radius)
return path
11 months ago
def paint(self, painter, option, widget):
painter.setRenderHint(QPainter.Antialiasing) # 设置抗锯齿
pen = QPen(Qt.black)
painter.setPen(pen)
11 months ago
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)) # 设置默认的填充颜色
11 months ago
# 绘制圆角矩形
painter.drawRoundedRect(self.rect, self.radius, self.radius)
11 months ago
# 计算文本的位置
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
11 months ago
# 绘制文本
painter.drawText(text_x, text_y, str(self.text))
11 months ago
def mousePressEvent(self, event):
# 鼠标点击时切换选中状态
self.isSelected = not self.isSelected
self.update()
11 months ago
# 发射选中信号
if self.isSelected:
self.selected.emit(self.id)
else:
self.unselected.emit(self.id)
11 months ago
super().mousePressEvent(event)