|
- #include "plccontrolitem.h"
- #include <QPainter>
- #include<QGraphicsScene>
- 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);
- }
|