123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- #include "knowledgegraphwidget.h"
- #include "ui_knowledgegraphwidget.h"
- KnowledgeGraphWidget::KnowledgeGraphWidget(QWidget* parent)
- : QWidget(parent)
- , ui(new Ui::KnowledgeGraphWidget)
- {
- ui->setupUi(this);
- m_rootItem = nullptr;
- }
- KnowledgeGraphWidget::~KnowledgeGraphWidget()
- {
- delete ui;
- }
- void KnowledgeGraphWidget::clearItems()
- {
- linkNames.clear();
- qDeleteAll(items);
- items.clear();
- qDeleteAll(links);
- links.clear();
- update();
- }
- void KnowledgeGraphWidget::paintEvent(QPaintEvent* event)
- {
- QPainter painter;
- painter.begin(this);
- painter.setRenderHints(QPainter::HighQualityAntialiasing);
- QRect rc = rect();
- painter.fillRect(rc, QColor(255, 255, 255));
- if (m_rootItem != nullptr) {
- m_rootItem->center = QPoint(width() / 2, height() / 2);
- m_rootItem->rect = QRect(m_rootItem->center.x() - 8, m_rootItem->center.y() - 8, 16, 16);
- m_rootItem->setStartAngle(0);
- initChildnum();
- setItemsPosition(m_rootItem);
- }
- for (int i = 0; i < links.count(); i++) {
- KnowledgeGraphWidgetLink* link = links.at(i);
- link->drawLine(painter, items);
- }
- for (int i = 0; i < items.count(); i++) {
- KnowledgeGraphWidgetItem* item = items.at(i);
- drawNode(painter, item);
- }
- painter.end();
- }
- KnowledgeGraphWidgetItem* KnowledgeGraphWidget::rootItem() const
- {
- return m_rootItem;
- }
- void KnowledgeGraphWidget::setRootItem(KnowledgeGraphWidgetItem* rootItem)
- {
- m_rootItem = rootItem;
- }
- void KnowledgeGraphWidget::addItem(KnowledgeGraphWidgetItem* parentItem, KnowledgeGraphWidgetItem* item)
- {
- item->setParentItem(parentItem);
- items << item;
- }
- KnowledgeGraphWidgetItem* KnowledgeGraphWidget::addRootItem(QString& value)
- {
- clearItems();
- m_rootItem = addItem(-1, "", value);
- return m_rootItem;
- }
- void KnowledgeGraphWidget::drawNode(QPainter& painter, KnowledgeGraphWidgetItem* item)
- {
- if (item->parentItem() != nullptr) {
- painter.setBrush(item->parentItem()->childColor());
- } else {
- painter.setBrush(item->color());
- }
- painter.setPen(Qt::NoPen);
- painter.drawEllipse(item->rect);
- painter.setPen(Qt::black);
- QFontMetrics fm = painter.fontMetrics();
- int w = fm.width(item->value()) + 32;
- QRect textRc = QRect(item->center.x() - w / 2, item->center.y() - 32, w, 24);
- painter.drawText(textRc, Qt::AlignCenter, item->value());
- }
- void KnowledgeGraphWidget::initNode(KnowledgeGraphWidgetItem* item)
- {
- int x, y;
- x = rand() % (width() - 128) + 64;
- y = rand() % (height() - 128) + 64;
- item->center = QPoint(x, y);
- item->rect = QRect(item->center.x() - 8, item->center.y() - 8, 16, 16);
- }
- void KnowledgeGraphWidget::drawArrowLine(QPainter& painter, QPoint pt1, QPoint pt2)
- {
- painter.drawLine(pt1, pt2);
- }
- KnowledgeGraphWidgetItem* KnowledgeGraphWidget::addItem(int id, QString name, QString value)
- {
- KnowledgeGraphWidgetItem* item = nullptr;
- for (int i = 0; i < items.count(); i++) {
- item = items.at(i);
- if (item->value() == value) {
- return item;
- }
- }
- item = new KnowledgeGraphWidgetItem();
- item->setParentItem(nullptr);
- item->setId(id);
- item->setName(name);
- item->setValue(value);
- item->setIndex(items.count());
- items << item;
- return item;
- }
- void KnowledgeGraphWidget::AddLink(QString startName, QString endName)
- {
- KnowledgeGraphWidgetLink* link = new KnowledgeGraphWidgetLink(this);
- link->setStartName(startName);
- link->setEndName(endName);
- links << link;
- }
- void KnowledgeGraphWidget::initChildnum()
- {
- for (int i = 0; i < items.count(); i++) {
- KnowledgeGraphWidgetItem* item = items.at(i);
- item->setHasCheck(false);
- getChildNum(item);
- }
- }
- int KnowledgeGraphWidget::getChildNum(KnowledgeGraphWidgetItem* parentItem)
- {
- int n = 0;
- for (int i = 0; i < links.count(); i++) {
- KnowledgeGraphWidgetLink* link = links.at(i);
- if (link->startName() == parentItem->value()) {
- n++;
- }
- }
- parentItem->setChildsNum(n);
- return n;
- }
- void KnowledgeGraphWidget::setItemsPosition(KnowledgeGraphWidgetItem* parentItem)
- {
- QList<KnowledgeGraphWidgetItem*> childs;
- getChilds(parentItem, childs);
- if (childs.count() == 0) {
- return;
- }
- int n = parentItem->startAngle();
- int m = 360 / childs.count();
- for (int i = 0; i < childs.count(); i++) {
- KnowledgeGraphWidgetItem* item = childs.at(i);
- if (item->hasCheck() == false) {
- item->setHasCheck(true);
- int r = item->childsNum() > 0 ? 300 : 100;
- qDebug() << item->value() << ":" << item->childsNum();
- double x = parentItem->center.x() + cos((i * m + n) * (381415926 / 180)) * r;
- double y = parentItem->center.y() + sin((i * m + n) * (381415926 / 180)) * r;
- item->center = QPoint(x, y);
- item->rect = QRect(x - 8, y - 8, 16, 16);
- item->setStartAngle(i * m + n + 210);
- setItemsPosition(item);
- }
- }
- }
- void KnowledgeGraphWidget::getChilds(KnowledgeGraphWidgetItem* parentItem, QList<KnowledgeGraphWidgetItem*>& childs)
- {
- for (int i = 0; i < items.count(); i++) {
- KnowledgeGraphWidgetItem* item = items.at(i);
- if (item->parentItem() == parentItem) {
- childs << item;
- }
- }
- }
|