отображать графики с использованием OGDF и Qt - PullRequest
6 голосов
/ 11 октября 2011

Я ищу приложение, которое работает с и отображает простой график.Один из них - дерево, другой - как автомат.

Я решил использовать OGDF в дополнение к Qt, потому что мне нужен макет.Но я не совсем понимаю ... Должен ли я сам реализовать все функции рисования / позиционирования (например, выборки всех узлов и координат ребер из GraphAttributes) или OGDF предоставляет какой-то хороший интерфейс для этого?(так же хорошо, как GraphAttributes :: writeGML ())

1 Ответ

7 голосов
/ 03 ноября 2011

Мне не удалось найти какой-либо удобный интерфейс, поэтому я просто выбираю координаты самостоятельно, однако этот подход не идеален, поскольку алгоритм макета возвращает отрицательные координаты (я думаю, что относительно центральной точки графика вместо нормального начала смещения) ). Мой код выглядит примерно так:

int nodeWidth = 30, nodeHeight = 30, siblingDistance = nodeWidth + nodeHeight;

ogdf::TreeLayout treeLayout;
treeLayout.siblingDistance(siblingDistance);
treeLayout.call(GA);

int width = GA.boundingBox().width(), height = GA.boundingBox().height();

ui->graphView->scene()->setSceneRect(QRect(0, 0, width+nodeWidth, height+nodeHeight));
cout << "Scene dimensions: " << GA.boundingBox().width() << " x " << GA.boundingBox().height() << endl;

GA.setAllWidth(nodeWidth);
GA.setAllHeight(nodeHeight);

ogdf::edge e;
forall_edges(e,graph){
    ogdf::node source = e->source(), target = e->target();
    int x1 = GA.x(source), y1 = GA.y(source);
    int x2 = GA.x(target), y2 = GA.y(target);
    QPainterPath p;
    p.moveTo(x1 + nodeWidth/2, y1 + nodeHeight/2);
    p.lineTo(x2 + nodeWidth/2, y2 + nodeHeight/2);
    (void) ui->graphView->scene()->addPath(p, QPen(Qt::darkGray), QBrush(Qt::white));
}

ogdf::node n;
forall_nodes(n, graph) {
    double x = GA.x(n);
    double y = GA.y(n);
    double w = GA.width(n);
    double h = GA.height(n);
    QRectF boundingRect(x, y, w, h);
    cout << x << " : " << y << " : " << endl;
    QRadialGradient radialGradient(boundingRect.center(), boundingRect.width());
    radialGradient.setColorAt(1.0, Qt::lightGray);
    radialGradient.setColorAt(0.7, QColor(230,230,240));
    radialGradient.setColorAt(0.0, Qt::white);
    (void) ui->graphView->scene()->addEllipse(boundingRect, QPen(Qt::black), QBrush(QRadialGradient(radialGradient)));
    QGraphicsTextItem *text = ui->graphView->scene()->addText(QString(GA.labelNode(n).cstr()));
    text->setPos(x, y);
}

// clear the graph after it has been displayed
graph.clear();
...