Почему QPainter масштабирует (косметические) точки на одной оси, хотя они не должны быть затронуты? - PullRequest
0 голосов
/ 05 сентября 2018

Я рисую линии и точки в своем приложении Qt, и у меня возникают проблемы с ошибкой масштабирования в QPainter. Мои линии работают нормально, но на точки влияют преобразования для определенных масштабов, хотя ручка настроена как «косметическая». Больше всего меня беспокоит то, что, похоже, затронута только одна ось (ось X). В противном случае я мог бы прибегнуть к некоторым проблемам точности с плавающей точкой в ​​коде преобразования / матрицы.

Qt версии: Qt 4.8 для встраиваемых , Qt 5.4 для настольных ПК , Qt 5.6 LTS для настольных ПК

Вот несколько визуализаций, которые на самом деле должны выглядеть одинаково (как и самый левый):

enter image description here

У меня есть RenderArea, полученная из QWidget, которая просто рисует одно из изображений выше. RenderArea просто создается в main () и показывается. Код здесь тривиален, так что вот соответствующий код рисования:

void RenderArea::paintEvent(QPaintEvent* /* event */)
{
    const qreal scaleFactor = 0.01;

    // Define a "unit" square
    std::vector<QPointF> points;
    points.push_back(QPointF(0, 0));
    points.push_back(QPointF(1.0, 0));
    points.push_back(QPointF(1.0, 1.0));
    points.push_back(QPointF(0, 1.0));

    // Build a scaled version of the points
    for (unsigned i = 0; i < points.size(); i++) {
        points[i] *= scaleFactor;
    }

    QPainter painter(this);

    painter.save();

    // Scale the painter so that every square takes 100 pixels
    // in screen space regardless of the scaleFactor:
    painter.scale(100.0 / scaleFactor, 100.0 / scaleFactor);

    QPen pointPen(Qt::blue, 10);
    pointPen.setCosmetic(true);
    painter.setPen(pointPen);
    painter.drawPoints(points.data(), points.size());

    QPen linePen(Qt::red, 5);
    linePen.setCosmetic(true);
    painter.setPen(linePen);
    painter.drawPolyline(points.data(), points.size());

    painter.restore();
}

Пример основан на примере базового рисования, поставляемого с Qt, но я убрал все, чтобы высветить проблему.

  • Почему возникает эта проблема?
  • Почему оно возникает только для одной оси?

1 Ответ

0 голосов
/ 31 октября 2018

Чтобы закрыть эту тему, я бы хотел добавить ссылку на другой вопрос stackoverflow: Почему QPainter :: drawPoint рисует горизонтальный отрезок?

Кажется, это ошибка в Qt, которая была подана здесь: QPainter :: drawPoints рисует отрезки линий вместо точек

Как указано в комментариях, эту ошибку можно устранить, написав собственный код для рисования точек, установив патч Qt, рисуя изображения вместо точек или используя drawEllipse.

...