2013-10-14 109 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不是没有必要的,它实际上是导致问题的原因。