MaterialBoxGraphicsView.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. qDebug() << "current row" << selectedLeftItem->getRow();
  22. }else{
  23. clearSeleted();
  24. return;
  25. }
  26. setCursor(Qt::OpenHandCursor); // 按下时设置为小手
  27. }else if(event->button() == Qt::RightButton){
  28. QGraphicsItem* item = itemAt(event->pos());
  29. if (item && dynamic_cast<MaterialBoxDie*>(item)) {
  30. clearSeleted();
  31. selectedRightItem = dynamic_cast<MaterialBoxDie*>(item);
  32. selectedRightItem->setRightSelected(true);
  33. qDebug()<<selectedRightItem->getRow();
  34. emit layerRightClicked(selectedRightItem->getRow()+1);
  35. }else{
  36. return;
  37. }
  38. }
  39. QGraphicsView::mousePressEvent(event);
  40. }
  41. void MaterialBoxGraphicsView::mouseReleaseEvent(QMouseEvent* event){
  42. if (event->button() == Qt::LeftButton) {
  43. setCursor(Qt::ArrowCursor); // 松开时恢复为箭头
  44. }
  45. }
  46. void MaterialBoxGraphicsView::wheelEvent(QWheelEvent* event) {
  47. if (event->orientation() == Qt::Vertical) {
  48. event->ignore(); // 忽略竖直滚轮事件(即禁用滚动条滑动)
  49. return;
  50. }
  51. event->accept();
  52. }
  53. void MaterialBoxGraphicsView::clearSeleted(){
  54. if(selectedLeftItem){
  55. selectedLeftItem->setLeftSelected(false);
  56. }
  57. if(selectedRightItem){
  58. selectedRightItem->setRightSelected(false);
  59. }
  60. }
  61. void BackgroundRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
  62. // 绘制灰色背景框
  63. painter->setPen(Qt::black);
  64. painter->setBrush(Qt::lightGray);
  65. painter->drawRect(m_containerWidthdp, m_containerHeightdp, m_containerWidth, m_containerHeight);
  66. }
  67. MaterialBoxDie::MaterialBoxDie(int row, int col, int status, qreal weight,qreal height, QGraphicsItem* parent)
  68. : QGraphicsRectItem(parent), row(row), col(col), status(status){
  69. setRect(0, 0, weight, height); // 设置单元格大小
  70. setBrush(getColorByStatus(status));
  71. // 设置边框(Pen)
  72. setPen(QPen(QColor(0, 0, 0), 0.5)); // 黑色边框,宽度为0.5
  73. }
  74. void MaterialBoxDie::setLeftSelected(bool selected){
  75. if (selected) {
  76. setPen(QPen(Qt::blue, 2));
  77. setZValue(1);
  78. } else {
  79. setPen(QPen(Qt::black, 0.5)); // 未选中时恢复为黑色边框
  80. setZValue(0);
  81. }
  82. }
  83. void MaterialBoxDie::setRightSelected(bool selected){
  84. if (selected) {
  85. setPen(QPen(Qt::green, 2));
  86. setZValue(1);
  87. } else {
  88. setPen(QPen(Qt::black, 0.5)); // 未选中时恢复为黑色边框
  89. setZValue(0);
  90. }
  91. }
  92. QColor MaterialBoxDie::getColorByStatus(int status){
  93. switch (status) {
  94. case 0: return QColor(255, 0, 0); // 红色
  95. case 1: return QColor(40, 129, 5); // 绿色
  96. default: return QColor(0, 0, 0);
  97. }
  98. }
  99. int MaterialBoxDie::getRow(){
  100. return row;
  101. }