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();
Nguồn
2011-11-03 13:09:08
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
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