Я рисую линии и точки в своем приложении Qt, и у меня возникают проблемы с ошибкой масштабирования в QPainter. Мои линии работают нормально, но на точки влияют преобразования для определенных масштабов, хотя ручка настроена как «косметическая». Больше всего меня беспокоит то, что, похоже, затронута только одна ось (ось X). В противном случае я мог бы прибегнуть к некоторым проблемам точности с плавающей точкой в коде преобразования / матрицы.
Qt версии: Qt 4.8 для встраиваемых , Qt 5.4 для настольных ПК , Qt 5.6 LTS для настольных ПК
Вот несколько визуализаций, которые на самом деле должны выглядеть одинаково (как и самый левый):
У меня есть 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, но я убрал все, чтобы высветить проблему.
- Почему возникает эта проблема?
- Почему оно возникает только для одной оси?