2011-10-11 17 views
6

簡単なグラフを表示しているアプリケーションを実装しようと思っています。それらの1つは木であり、1つはオートマトンのようなものです。OGDFとQtを使ってグラフを表示する

私はレイアウトが必要なので、Qtに加えてOGDFを使用することに決めました。しかし、私はこれを得ていません...(GraphAttributesからすべてのノードとエッジの座標を取得するような)描画/位置決め機能を自分で実装する必要がありますか?それとも、OGDFはいくつかの素晴らしいインターフェースを提供していますか? (GraphAttributes :: writeGML()と同じくらい)

答えて

7

私はちょうど自分自身で座標を取得していますので、レイアウトアルゴリズムが負の座標を返すので、このアプローチは完全ではありません私が思うに、通常の爪先起源の代わりにグラフの中心点)。私のコードはちょっとこのように見えます:

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(); 
+0

ありがとう!私が今見ているように、私は正しい道にいました。サンプルコードを持っていると、このような大きな助けになります! OGDFの経験はありますか? – TeaOverflow

+0

ああ、QGraphicSceneではノードの負の座標がうまく働きます。その0,0は中心にあるようです。 – TeaOverflow

関連する問題