Как нарисовать и заполнить треугольник с помощью 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 точками и заполнить область, но вывод не показан.

3 ответов


Я думаю вам не нужно называть moveTo() функции после вызова lineTo() потому что текущая позиция уже обновлена до конечной точки линии, которую вы рисуете. Вот код, который рисует прямоугольник для меня:

// 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")));

Если вы хотите использовать 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")));

в документации сказано, что: "перемещение текущей точки и начнется новый подпуть (неявно закрытия ранее тока в путь, когда новый начинается)".

Это означает, что вы должны один раз перейти к началу пути, а затем использовать только lineTo, чтобы нарисовать заполняемую форму.

Я добавил этот ответ, потому что ответ " я думаю, что вам не нужно вызывать функцию moveTo () после вызова lineTo (), потому что текущая позиция уже обновлена до конца точка линии, которую вы рисуете."совершенно неверно. MoveTo не является ненужным, это на самом деле вызывает проблему.