2013-10-14 152 views
6

這是我試過的,它沒有輸出。我哪裏錯了?如何使用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"))); 

我剛纔想創建這3點之間的路徑,並填補了區域,但沒有顯示輸出。

+0

您是否更改過任何QPainter座標變換矩陣? – Nazar554

+0

@ Nazar554這是我唯一的代碼。除此之外我什麼都沒做。 –

回答

10

我想你不需要在lineTo()之後調用moveTo()函數,因爲當前位置已經更新到你繪製的直線的終點。下面是繪製一個矩形,我的代碼:

// 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

哇,它的作品。據說moveTo被用來將筆移動到我們開始劃線的地步 - 那爲什麼我錯了? –

+0

@ user462608:你沒有錯,但是當你開始繪製你的矩形時,你只需要做一次(參見示例代碼中第一次調用moveTo())。在你調用'lineTo()'後,位置是自動改變的。 – vahancho

+0

@ user462608:那是不正確的。 'lineTo()'的文檔說:'在繪製線後,當前位置更新爲線的終點。' – vahancho

5

如果你想使用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

該文件說:「移動當前點也將開始一個新的子路徑(隱式地關閉之前當新的啓動時的當前路徑)「。

這意味着您應該先移動到路徑的原點,然後使用lineTo爲了繪製要填充的形狀。

我添加了這個答案,因爲答案是「我認爲在你調用lineTo()之後你不需要調用moveTo()函數,因爲當前位置已經更新到你畫的那一行的結束點。是很具誤導性的。 moveTo不是沒有必要的,它實際上是導致問題的原因。