BitInspector.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "pch.h"
  2. #include "BitInspector.h"
  3. #define ItemWidth 20
  4. #define FieldStart 170
  5. #define EmptySpaceRight 5
  6. #define EmptySpaceBottom 40
  7. #define HeaderSpace 0
  8. BitInspector::BitInspector(QWidget* parent)
  9. : QWidget(parent)
  10. {
  11. //DummyData
  12. //std::vector< SolutionPointData>* dummyVec = new std::vector< SolutionPointData>();
  13. //SolutionPointData data;
  14. //data.iteration = 20;
  15. //data.bitVec.push_back(true);
  16. //data.objectiveFunction = 230.234;
  17. //data.particleNumber = 120;
  18. //dummyVec->push_back(data);
  19. //begin = dummyVec->begin();
  20. //end = dummyVec->end();
  21. }
  22. BitInspector::~BitInspector()
  23. {
  24. }
  25. void BitInspector::updateData(std::vector<SolutionPointData>::iterator begin, std::vector<SolutionPointData>::iterator end)
  26. {
  27. this->begin = begin;
  28. this->end = end;
  29. setMinimumSize(FieldStart + begin->bitVec.size() * 1 + EmptySpaceRight, std::distance(begin, end) * ItemWidth + EmptySpaceBottom + HeaderSpace);
  30. update();
  31. }
  32. void BitInspector::clear()
  33. {
  34. begin = std::vector<SolutionPointData>::iterator();
  35. end = std::vector<SolutionPointData>::iterator();
  36. update();
  37. }
  38. void BitInspector::keyPressEvent(QKeyEvent* event)
  39. {
  40. }
  41. void BitInspector::paintEvent(QPaintEvent* event)
  42. {
  43. if (begin == end) {
  44. return;
  45. }
  46. int value = (parentWidget()->size().width() - FieldStart - EmptySpaceRight) / begin->bitVec.size();
  47. if (value > 1) {
  48. sizePerBit = value;
  49. }
  50. else {
  51. sizePerBit = 1;
  52. }
  53. //PaintList
  54. QPainter painter(this);
  55. painter.setRenderHint(QPainter::RenderHint::HighQualityAntialiasing);
  56. painter.setFont(QFont("Arial", 8));
  57. painter.setPen(QColor(0, 0, 0));
  58. QRect rect(event->rect());
  59. rect.moveTop(rect.top() - parentWidget()->size().height());
  60. int minimumY = rect.top() - parentWidget()->size().height();
  61. int maximumY = rect.bottom() + parentWidget()->size().height();
  62. QPen blackPen(QColor(0, 0, 0));
  63. QPen whitePen(QColor(255, 255, 255));
  64. int iteration = 0;
  65. int drawSize = (sizePerBit > 1)? sizePerBit - 1: 1;
  66. if (begin != end) {
  67. painter.fillRect(QRect(FieldStart -1 , 0, begin->bitVec.size() * sizePerBit, std::distance(begin, end) * ItemWidth), Qt::lightGray);
  68. int width = FieldStart + begin->bitVec.size() * sizePerBit;
  69. for (auto iter = begin; iter != end; iter++) {
  70. int startY = (iteration++) * ItemWidth + HeaderSpace;
  71. if (startY <= minimumY) continue;
  72. if (startY >= maximumY) break;
  73. QRect textRect(0, startY, 40, ItemWidth);
  74. painter.drawText(textRect, Qt::AlignCenter, QString::number(iter->iteration));
  75. textRect.moveLeft(40);
  76. painter.drawText(textRect, Qt::AlignCenter, QString::number(iter->particleNumber));
  77. textRect.moveLeft(80);
  78. textRect.setWidth(90);
  79. painter.drawText(textRect, Qt::AlignCenter, QString::number(iter->objectiveFunction, 'f', 1));
  80. //painter.setPen(blackPen);
  81. for (int j = 0; j < iter->bitVec.size(); j++) {
  82. painter.fillRect(FieldStart + j * sizePerBit, startY, drawSize, ItemWidth, (iter->bitVec[j]) ? blackPen.color() : whitePen.color());
  83. }
  84. painter.fillRect(FieldStart, startY, width - FieldStart, 1 ,QColor(140,140,140));
  85. }
  86. }
  87. }