2011-10-11 15 views
6

kullanarak grafik ekranları Ben basit grafik ile çalışan ve görüntüleyen bir uygulama uygulamak için arıyorum. Bunlardan biri ağaç, biri otomaton gibidir.OGDF ve Qt

Düzenlemeye ihtiyacım olduğu için, OGT'yi Qt'ye ek olarak kullanmaya karar verdim. Ama bunu tam olarak anlayamıyorum ... tüm çizim/konumlandırma işlevlerini kendim uygulamak zorundayım (GraphAttributes'tan tüm düğüm ve kenar koordinatlarını almak gibi) veya OGDF bunun için güzel bir arayüz sağlıyor mu? (GraphAttributes :: writeGML() kadar iyi

cevap

7

Hiçbir arabirim bulamadım bu yüzden koordinatları kendim getiriyorum, ancak bu yaklaşım mükemmel değil çünkü düzen algoritması negatif koordinatlar döndürüyor. Grafik merkezi noktası, normal üst düzey kökeni yerine, düşünüyorum. Kodum şunun gibi görünüyor:

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

Çok teşekkürler! Şu an gördüğüm gibi doğru yoldaydım. Örnek kodun bulunması çok büyük bir yardım! OGDF ile deneyimlediniz mi? – TeaOverflow

+0

Oh ve düğümlerin negatif koordinatları QGraphicScene ile gayet güzel çalışıyorlar, çünkü onun '0,0' kendi merkezinde de var gibi görünüyor. – TeaOverflow