25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
2.4 KiB

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