knowledgegraphwidget.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "knowledgegraphwidget.h"
  2. #include "ui_knowledgegraphwidget.h"
  3. KnowledgeGraphWidget::KnowledgeGraphWidget(QWidget* parent)
  4. : QWidget(parent)
  5. , ui(new Ui::KnowledgeGraphWidget)
  6. {
  7. ui->setupUi(this);
  8. m_rootItem = nullptr;
  9. }
  10. KnowledgeGraphWidget::~KnowledgeGraphWidget()
  11. {
  12. delete ui;
  13. }
  14. void KnowledgeGraphWidget::clearItems()
  15. {
  16. linkNames.clear();
  17. qDeleteAll(items);
  18. items.clear();
  19. qDeleteAll(links);
  20. links.clear();
  21. update();
  22. }
  23. void KnowledgeGraphWidget::paintEvent(QPaintEvent* event)
  24. {
  25. QPainter painter;
  26. painter.begin(this);
  27. painter.setRenderHints(QPainter::HighQualityAntialiasing);
  28. QRect rc = rect();
  29. painter.fillRect(rc, QColor(255, 255, 255));
  30. if (m_rootItem != nullptr) {
  31. m_rootItem->center = QPoint(width() / 2, height() / 2);
  32. m_rootItem->rect = QRect(m_rootItem->center.x() - 8, m_rootItem->center.y() - 8, 16, 16);
  33. m_rootItem->setStartAngle(0);
  34. initChildnum();
  35. setItemsPosition(m_rootItem);
  36. }
  37. for (int i = 0; i < links.count(); i++) {
  38. KnowledgeGraphWidgetLink* link = links.at(i);
  39. link->drawLine(painter, items);
  40. }
  41. for (int i = 0; i < items.count(); i++) {
  42. KnowledgeGraphWidgetItem* item = items.at(i);
  43. drawNode(painter, item);
  44. }
  45. painter.end();
  46. }
  47. KnowledgeGraphWidgetItem* KnowledgeGraphWidget::rootItem() const
  48. {
  49. return m_rootItem;
  50. }
  51. void KnowledgeGraphWidget::setRootItem(KnowledgeGraphWidgetItem* rootItem)
  52. {
  53. m_rootItem = rootItem;
  54. }
  55. void KnowledgeGraphWidget::addItem(KnowledgeGraphWidgetItem* parentItem, KnowledgeGraphWidgetItem* item)
  56. {
  57. item->setParentItem(parentItem);
  58. items << item;
  59. }
  60. KnowledgeGraphWidgetItem* KnowledgeGraphWidget::addRootItem(QString& value)
  61. {
  62. clearItems();
  63. m_rootItem = addItem(-1, "", value);
  64. return m_rootItem;
  65. }
  66. void KnowledgeGraphWidget::drawNode(QPainter& painter, KnowledgeGraphWidgetItem* item)
  67. {
  68. if (item->parentItem() != nullptr) {
  69. painter.setBrush(item->parentItem()->childColor());
  70. } else {
  71. painter.setBrush(item->color());
  72. }
  73. painter.setPen(Qt::NoPen);
  74. painter.drawEllipse(item->rect);
  75. painter.setPen(Qt::black);
  76. QFontMetrics fm = painter.fontMetrics();
  77. int w = fm.width(item->value()) + 32;
  78. QRect textRc = QRect(item->center.x() - w / 2, item->center.y() - 32, w, 24);
  79. painter.drawText(textRc, Qt::AlignCenter, item->value());
  80. }
  81. void KnowledgeGraphWidget::initNode(KnowledgeGraphWidgetItem* item)
  82. {
  83. int x, y;
  84. x = rand() % (width() - 128) + 64;
  85. y = rand() % (height() - 128) + 64;
  86. item->center = QPoint(x, y);
  87. item->rect = QRect(item->center.x() - 8, item->center.y() - 8, 16, 16);
  88. }
  89. void KnowledgeGraphWidget::drawArrowLine(QPainter& painter, QPoint pt1, QPoint pt2)
  90. {
  91. painter.drawLine(pt1, pt2);
  92. }
  93. KnowledgeGraphWidgetItem* KnowledgeGraphWidget::addItem(int id, QString name, QString value)
  94. {
  95. KnowledgeGraphWidgetItem* item = nullptr;
  96. for (int i = 0; i < items.count(); i++) {
  97. item = items.at(i);
  98. if (item->value() == value) {
  99. return item;
  100. }
  101. }
  102. item = new KnowledgeGraphWidgetItem();
  103. item->setParentItem(nullptr);
  104. item->setId(id);
  105. item->setName(name);
  106. item->setValue(value);
  107. item->setIndex(items.count());
  108. items << item;
  109. return item;
  110. }
  111. void KnowledgeGraphWidget::AddLink(QString startName, QString endName)
  112. {
  113. KnowledgeGraphWidgetLink* link = new KnowledgeGraphWidgetLink(this);
  114. link->setStartName(startName);
  115. link->setEndName(endName);
  116. links << link;
  117. }
  118. void KnowledgeGraphWidget::initChildnum()
  119. {
  120. for (int i = 0; i < items.count(); i++) {
  121. KnowledgeGraphWidgetItem* item = items.at(i);
  122. item->setHasCheck(false);
  123. getChildNum(item);
  124. }
  125. }
  126. int KnowledgeGraphWidget::getChildNum(KnowledgeGraphWidgetItem* parentItem)
  127. {
  128. int n = 0;
  129. for (int i = 0; i < links.count(); i++) {
  130. KnowledgeGraphWidgetLink* link = links.at(i);
  131. if (link->startName() == parentItem->value()) {
  132. n++;
  133. }
  134. }
  135. parentItem->setChildsNum(n);
  136. return n;
  137. }
  138. void KnowledgeGraphWidget::setItemsPosition(KnowledgeGraphWidgetItem* parentItem)
  139. {
  140. QList<KnowledgeGraphWidgetItem*> childs;
  141. getChilds(parentItem, childs);
  142. if (childs.count() == 0) {
  143. return;
  144. }
  145. int n = parentItem->startAngle();
  146. int m = 360 / childs.count();
  147. for (int i = 0; i < childs.count(); i++) {
  148. KnowledgeGraphWidgetItem* item = childs.at(i);
  149. if (item->hasCheck() == false) {
  150. item->setHasCheck(true);
  151. int r = item->childsNum() > 0 ? 300 : 100;
  152. qDebug() << item->value() << ":" << item->childsNum();
  153. double x = parentItem->center.x() + cos((i * m + n) * (381415926 / 180)) * r;
  154. double y = parentItem->center.y() + sin((i * m + n) * (381415926 / 180)) * r;
  155. item->center = QPoint(x, y);
  156. item->rect = QRect(x - 8, y - 8, 16, 16);
  157. item->setStartAngle(i * m + n + 210);
  158. setItemsPosition(item);
  159. }
  160. }
  161. }
  162. void KnowledgeGraphWidget::getChilds(KnowledgeGraphWidgetItem* parentItem, QList<KnowledgeGraphWidgetItem*>& childs)
  163. {
  164. for (int i = 0; i < items.count(); i++) {
  165. KnowledgeGraphWidgetItem* item = items.at(i);
  166. if (item->parentItem() == parentItem) {
  167. childs << item;
  168. }
  169. }
  170. }