Ich programmiere eine GUI, die Diagramme mit Qt zeichnet. Mein Maler zeigt einige Inkonsistenzen: Er malt die Grafik nur in 50% der Fälle, in denen ich genau die gleiche Binärdatei nach der Kompilierung verwende. Ich rufe QPainter's begin() auf, und ich stellte auch sicher, dass die Parameter, die ich an die Zeichenfunktionen wie drawEllipse() übergeben habe, initialisiert sind und gültige Werte haben, wenn ich die Funktion aufruft.QPainter nicht konsequent zeichnen
Unten ist der entsprechende Code (beachten Sie, dass der Parameter Maler initialisiert wurde und beginnen() wurde vor dieser Funktion aufgerufen):
void GraphWidget::paintEvent(QPaintEvent *event) {
QWidget::paintEvent(event);
this->painter = new QPainter(this);
painter->setRenderHint(QPainter::Antialiasing);
// draw graph itself
painter->translate(xOffset, yOffset);
painter->scale(graphScale, graphScale);
paintGraph(painter);
}
void GraphWidget::paintGraph() {
if (this->graph) {
// Iterate thought all edges and draw them
for (Agnode_t *node = agfstnode(graph); node;
node = agnxtnode(graph, node)) {
for (Agedge_t *edge = agfstout(graph, node); edge;
edge = agnxtout(graph, edge)) {
drawEdge(edge);
}
}
// Iterate through all nodes and draw them
for (Agnode_t *node = agfstnode(graph); node;
node = agnxtnode(graph, node)) {
drawNode(node);
}
}
}
void GraphWidget::drawNode(Agnode_t *node) {
...
//Height and width of node, in pixels.
float scaleWidth = width * this->logicalDpiX();
float scaleHeight = height * this->logicalDpiY();
std::cout << "Drawing individual node. x = " << x << ". scaleWidth = " << scaleWidth << ". y = " << y << ". ScaleHeight = " << scaleHeight << "\n";
//Actual node painting takes place here.
painter->drawEllipse(x - scaleWidth/2, y - scaleHeight/2, scaleWidth, scaleHeight);
...
}
void GraphWidget::drawEdge(Agedge_t *edge) {
// retrieve the position attribute and parse it
float lastx, lasty, x, y;
getNodePos(agtail(edge), lastx, lasty);
auto spline_list = ED_spl(edge)->list;
for (int i = 0; i < spline_list->size; i++) {
x = spline_list->list[i].x;
y = spline_list->list[i].y;
painter->drawLine(lastx, lasty, x, y);
lastx = x;
lasty = y;
}
getNodePos(aghead(edge), x, y);
painter->drawLine(lastx, lasty, x, y);
}
Bitte posten Sie eine [mcve]. –
Es sei denn, es gibt eine Menge Code, zeigen Sie bitte die vollständigen 'GraphWidget :: drawNode' und' GraphWidget :: paintEvent' Implementierungen - oder zumindest * alle * relevanten Teile davon. –
Entschuldigung - Ich habe gerade alle relevanten Malfunktionen hinzugefügt! Hoffe, das hilft mehr und danke. Ich arbeite mit Graphviz, falls Sie sich über die Objekte Agnode_t und Agedge_t wundern. Sie stammen aus der Graphviz-Bibliothek. –