2011-10-11 29 views
6

Im tìm cách triển khai ứng dụng đang làm việc và hiển thị biểu đồ đơn giản. Một trong số đó là một cái cây, một cái giống như một chiếc automaton.hiển thị biểu đồ bằng cách sử dụng OGDF và Qt

Tôi quyết định sử dụng OGDF ngoài Qt, vì tôi cần bố cục. Nhưng Im không hoàn toàn nhận được điều này ... tôi có phải thực hiện tất cả các bản vẽ/chức năng định vị bản thân mình (như lấy tất cả các nút và các tọa độ cạnh từ GraphAttributes) hay không OGDF cung cấp một số giao diện đẹp cho điều đó? (tốt đẹp như GraphAttributes :: writeGML())

Trả lời

7

Tôi không thể tìm thấy bất kỳ giao diện đẹp nào vì vậy tôi chỉ tìm nạp tọa độ, tuy nhiên, cách tiếp cận này không hoàn hảo vì thuật toán bố cục trả về các tọa độ âm (liên quan đến một điểm trung tâm đồ thị tôi nghĩ, thay vì nguồn gốc topleft bình thường). Mã của tôi trông giống như thế này:

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

Cảm ơn rất nhiều! Tôi đã đi đúng hướng, như tôi thấy bây giờ. Có mã ví dụ là sự trợ giúp tuyệt vời như vậy! Bạn có kinh nghiệm với OGDF? – TeaOverflow

+0

Oh và các tọa độ âm của các nút hoạt động khá độc đáo với QGraphicScene, vì '0,0' của nó dường như nằm ở trung tâm của nó. – TeaOverflow

Các vấn đề liên quan