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

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