MaterialBoxGraphicsView.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "MaterialBoxGraphicsView.h"
  2. MaterialBoxGraphicsView::MaterialBoxGraphicsView(QGraphicsScene* scene, QWidget* parent)
  3. : QGraphicsView(scene, parent){
  4. setRenderHint(QPainter::Antialiasing);
  5. setTransformationAnchor(QGraphicsView::AnchorUnderMouse); // 缩放时以鼠标为中心
  6. // 禁用并隐藏水平滚动条
  7. setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  8. setHorizontalScrollBar(nullptr);
  9. // 禁用并隐藏垂直滚动条
  10. setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  11. setVerticalScrollBar(nullptr);
  12. setDragMode(QGraphicsView::NoDrag);
  13. };
  14. void MaterialBoxGraphicsView::mousePressEvent(QMouseEvent* event){
  15. if(event->button() == Qt::LeftButton){
  16. QGraphicsItem* item = itemAt(event->pos());
  17. if (item && dynamic_cast<MaterialBoxDie*>(item)) {
  18. clearSeleted();
  19. selectedLeftItem = dynamic_cast<MaterialBoxDie*>(item);
  20. selectedLeftItem->setLeftSelected(true);
  21. }else{
  22. clearSeleted();
  23. return;
  24. }
  25. setCursor(Qt::OpenHandCursor); // 按下时设置为小手
  26. }else if(event->button() == Qt::RightButton){
  27. QGraphicsItem* item = itemAt(event->pos());
  28. if (item && dynamic_cast<MaterialBoxDie*>(item)) {
  29. clearSeleted();
  30. selectedRightItem = dynamic_cast<MaterialBoxDie*>(item);
  31. selectedRightItem->setRightSelected(true);
  32. qDebug()<<selectedRightItem->getCurrentLayer();
  33. m_pCViewInterface->GetViewMatrix()->MoveMaterialBoxToiLayers(selectedRightItem->getCurrentLayer());
  34. }else{
  35. return;
  36. }
  37. }
  38. QGraphicsView::mousePressEvent(event);
  39. }
  40. void MaterialBoxGraphicsView::setCViewInterface(ns_module::CViewInterface* CViewInterface) {
  41. m_pCViewInterface = CViewInterface;
  42. }
  43. void MaterialBoxGraphicsView::mouseReleaseEvent(QMouseEvent* event){
  44. if (event->button() == Qt::LeftButton) {
  45. setCursor(Qt::ArrowCursor); // 松开时恢复为箭头
  46. }
  47. }
  48. void MaterialBoxGraphicsView::wheelEvent(QWheelEvent* event) {
  49. if (event->orientation() == Qt::Vertical) {
  50. event->ignore(); // 忽略竖直滚轮事件(即禁用滚动条滑动)
  51. return;
  52. }
  53. event->accept();
  54. }
  55. void MaterialBoxGraphicsView::clearSeleted(){
  56. if(selectedLeftItem){
  57. selectedLeftItem->setLeftSelected(false);
  58. }
  59. if(selectedRightItem){
  60. selectedRightItem->setRightSelected(false);
  61. }
  62. }
  63. void BackgroundRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
  64. // 绘制灰色背景框
  65. painter->setPen(Qt::black);
  66. painter->setBrush(Qt::lightGray);
  67. painter->drawRect(m_containerWidthdp, m_containerHeightdp, m_containerWidth, m_containerHeight);
  68. }
  69. MaterialBoxDie::MaterialBoxDie(int currentLayer, int status, qreal weight,qreal height, QGraphicsItem* parent)
  70. : QGraphicsRectItem(parent), m_ncurrentLayer(currentLayer), status(status){
  71. setRect(0, 0, weight, height); // 设置单元格大小
  72. setBrush(getColorByStatus(status));
  73. // 设置边框(Pen)
  74. setPen(QPen(QColor(0, 0, 0), 0.5)); // 黑色边框,宽度为0.5
  75. }
  76. void MaterialBoxDie::setLeftSelected(bool selected){
  77. if (selected) {
  78. setPen(QPen(Qt::blue, 2));
  79. setZValue(1);
  80. } else {
  81. setPen(QPen(Qt::black, 0.5)); // 未选中时恢复为黑色边框
  82. setZValue(0);
  83. }
  84. }
  85. void MaterialBoxDie::setRightSelected(bool selected){
  86. if (selected) {
  87. setPen(QPen(Qt::green, 2));
  88. setZValue(1);
  89. } else {
  90. setPen(QPen(Qt::black, 0.5)); // 未选中时恢复为黑色边框
  91. setZValue(0);
  92. }
  93. }
  94. QColor MaterialBoxDie::getColorByStatus(int status){
  95. switch (status) {
  96. case 0: return QColor(255, 0, 0); // 红色
  97. case 1: return QColor(40, 129, 5); // 绿色
  98. default: return QColor(0, 0, 0);
  99. }
  100. }
  101. int MaterialBoxDie::getCurrentLayer(){
  102. return m_ncurrentLayer;
  103. }