#include "plccontrolitem.h" #include #include PlcControlItem::PlcControlItem(PlcControlType type, QGraphicsItem* parent) : QGraphicsItem(parent), m_type(type) { // 设置控件属性:可移动、可选择、发送几何变化信号 setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges); // 设置变换原点为控件中心(优化旋转/缩放时的渲染) setTransformOriginPoint(boundingRect().center()); } // 关键修复1:确保边界矩形足够大,包含所有绘制内容 QRectF PlcControlItem::boundingRect() const { // 扩大边界1像素,避免边缘被裁剪(解决抗锯齿导致的边缘缺失) return QRectF(0, 0, 100, 40).adjusted(-1, -1, 1, 1); } // 关键修复2:优化绘制逻辑,确保完整重绘 void PlcControlItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { // 启用抗锯齿(使边缘平滑) painter->setRenderHint(QPainter::Antialiasing); // 绘制控件背景 painter->setPen(Qt::black); // 边框颜色 //painter->setBrush(isSelected() ? Qt::gray : Qt::white); // 选中时变灰 painter->drawRect(0, 0, 100, 40); // 绘制主体矩形(使用原始尺寸) // 绘制控件文本 QString label; switch (m_type) { case PlcControlType::NormallyOpen: label = "常开"; break; case PlcControlType::NormallyClosed: label = "常闭"; break; case PlcControlType::Coil: label = "线圈"; break; case PlcControlType::Compare: label = "比较"; break; } painter->drawText(QRectF(0, 0, 100, 40), Qt::AlignCenter, label); // 文本居中 } // 鼠标按下:记录初始位置(控件局部坐标) void PlcControlItem::mousePressEvent(QGraphicsSceneMouseEvent* event) { m_dragStartPos = event->pos(); event->accept(); QGraphicsItem::mousePressEvent(event); } // 鼠标移动:更新位置并强制重绘 void PlcControlItem::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { if (isSelected()) { // 计算位移(基于控件局部坐标) QPointF delta = event->pos() - m_dragStartPos; // 移动控件 moveBy(delta.x(), delta.y()); // 关键修复3:主动触发场景重绘,确保新旧位置都刷新 scene()->update(); } event->accept(); QGraphicsItem::mouseMoveEvent(event); }