2013-10-14 14 views
6

Questo è quello che ho provato, non mi ha dato alcun risultato. Dove sto andando male?Come disegnare e riempire un triangolo con QPainter?

 // Start point of bottom line 
     qreal startPointX1 = 600.0; 
     qreal startPointY1 = 600.0; 

     // End point of bottom line   
     qreal endPointX1 = 600.0; 
     qreal endPointY1 = 1200.0; 

     // Start point of top line 
     qreal startPointX2 = 600.0; 
     qreal startPointY2 = 600.0; 

     // End point of top line   
     qreal endPointX2 = 800.0; 
     qreal endPointY2 = 1200.0; 


     QPainterPath path; 
     // Set pen to this point. 
     path.moveTo (startPointX1, startPointY1); 
     // Draw line from pen point to this point. 
     path.lineTo (endPointX1, endPointY1); 

     path.moveTo (endPointX1, endPointY1); 
     path.lineTo (endPointX2, endPointY2); 

     path.moveTo (endPointX2, endPointY2); 
     path.lineTo (startPointX1, startPointY1); 

     painter.setPen (Qt :: NoPen); 
     painter.fillPath (path, QBrush (QColor ("blue"))); 

Sono appena cercato di creare un percorso tra questi 3 punti e riempire la zona, ma non c'è output mostrato.

+0

hai modificato le matrici di trasformazione delle coordinate QPainter? – Nazar554

+0

@ Nazar554 Questo è il mio unico codice. Non ho fatto niente oltre a quello. –

risposta

10

Penso che non sia necessario chiamare la funzione moveTo() dopo aver chiamato lineTo() perché la posizione corrente è già stata aggiornata al punto finale della linea tracciata. Ecco il codice che disegna un rettangolo per me:

// Start point of bottom line 
qreal startPointX1 = 600.0; 
qreal startPointY1 = 600.0; 

// End point of bottom line   
qreal endPointX1 = 600.0; 
qreal endPointY1 = 1200.0; 

// Start point of top line 
qreal startPointX2 = 600.0; 
qreal startPointY2 = 600.0; 

// End point of top line   
qreal endPointX2 = 800.0; 
qreal endPointY2 = 1200.0; 

QPainterPath path; 
// Set pen to this point. 
path.moveTo (startPointX1, startPointY1); 
// Draw line from pen point to this point. 
path.lineTo (endPointX1, endPointY1); 

//path.moveTo (endPointX1, endPointY1); // <- no need to move 
path.lineTo (endPointX2, endPointY2); 

//path.moveTo (endPointX2, endPointY2); // <- no need to move 
path.lineTo (startPointX1, startPointY1); 

painter.setPen (Qt :: NoPen); 
painter.fillPath (path, QBrush (QColor ("blue"))); 
+0

wow, funziona. Si diceva che "moveTo' fosse usato per spostare la penna al punto da cui avremmo iniziato a disegnare una linea - quindi perché mi sbagliavo? –

+0

@ user462608: non si è sbagliato, ma è necessario farlo una volta sola, quando si inizia a disegnare il rettangolo (vedere la prima chiamata di 'moveTo()' nel codice di esempio). Dopo aver chiamato la posizione 'lineTo()' cambia automaticamente. – vahancho

+0

@ user462608: non è vero. I documenti per 'lineTo()' dicono: 'Dopo che la linea è stata disegnata, la posizione corrente viene aggiornata per essere al punto finale della riga. – vahancho

5

Se si desidera utilizzare QRectF

QRectF rect = QRectF(0, 0, 100, 100); 

QPainterPath path; 
path.moveTo(rect.left() + (rect.width()/2), rect.top()); 
path.lineTo(rect.bottomLeft()); 
path.lineTo(rect.bottomRight()); 
path.lineTo(rect.left() + (rect.width()/2), rect.top()); 

painter.fillPath(path, QBrush(QColor ("blue"))); 
1

La documentazione dice: "Lo spostamento del punto corrente inizierà anche una nuova sottotracciato (implicitamente chiudendo la precedenza percorso corrente quando viene avviato il nuovo) ".

Ciò significa che, una volta spostati sull'origine del percorso, utilizzare solo la riga per disegnare la forma da riempire.

Ho aggiunto questa risposta perché la risposta "Penso che non sia necessario chiamare la funzione moveTo() dopo aver chiamato lineTo() perché la posizione corrente è già stata aggiornata al punto finale della linea che si disegna." è abbastanza fuorviante. Il moveTo non è inutile, in realtà sta causando il problema.

Problemi correlati