【问题标题】:How to draw and fill a triangle with QPainter?如何使用 QPainter 绘制和填充三角形?
【发布时间】:2013-10-14 09:00:42
【问题描述】:

这是我尝试过的,它没有给我任何输出。我哪里错了?

      // 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 个点之间创建一条路径并填充该区域,但没有显示输出。

【问题讨论】:

  • 你改变了任何QPainter坐标变换矩阵吗?
  • @Nazar554 这是我唯一的代码。除此之外,我什么也没做。

标签: qt qpainter


【解决方案1】:

我认为你在调用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")));

【讨论】:

  • 哇,它有效。但据说moveTo 用于将笔移动到我们开始画线的位置——那我为什么错了?
  • @user462608:你没有错,但你只需要这样做一次,当你开始绘制你的矩形时(参见示例代码中moveTo() 的第一次调用)。调用lineTo() 后位置会自动变化。
  • @user462608:这不是真的。 lineTo() 的文档说:After the line is drawn, the current position is updated to be at the end point of the line.
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    文档说:“移动当前点也将启动一个新的子路径(在启动新路径时隐式关闭以前的当前路径)”。

    这意味着你应该移动到路径的原点,然后只使用 lineTo 来绘制要填充的形状。

    我添加了这个答案,因为答案“我认为你不需要在调用 lineTo() 后调用 moveTo() 函数,因为当前位置已经更新到你绘制的线的终点。”很有误导性。 moveTo 不是不必要的,它实际上是导致问题的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多