2017-05-25 3 views
0

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

Bitte posten Sie eine [mcve]. –

+0

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. –

+0

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. –

Antwort

0

das Problem gefunden. Aufruf painter->translate(xOffset, yOffset) verursacht die Maler Probleme, weil, als ich das Fenster öffnete, xOffset und yOffset wurden nicht initialisiert, so meine Vermutung ist, dass sie zufällige Werte genommen und der Graph wurde in eine zufällige Stelle übersetzt, wo ich es nicht sehen konnte. Ich habe nur sichergestellt, dass die Offset-Variablen im Konstruktor auf 0 gesetzt werden, und das behob das Problem.