首页 > 解决方案 > 为什么 QPainter 在一个轴上缩放(装饰)点,尽管它们不应该受到影响?

问题描述

我在我的 Qt 应用程序中绘制线条和点,并且遇到了 QPainter 中看起来像缩放错误的问题。我的线条工作得很好,但点会受到某些比例的转换的影响,尽管笔设置为“化妆品”。最困扰我的是,似乎只有一个轴(x 轴)受到影响。否则,我可以将其归结为转换/矩阵代码中的一些浮点精度问题。

Qt 版本:嵌入式 Qt 4.8桌面 Qt 5.4,桌面Qt 5.6 LTS

以下是一些实际上应该看起来都一样的效果图(就像最左边的一样):

在此处输入图像描述

我有一个从 QWidget 派生的 RenderArea ,它只是绘制上面的图像之一。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 附带的 basicdrawing 示例,但我剥离了所有内容以突出问题。

标签: c++qtqpainter

解决方案


要结束这个话题,我想添加对另一个 stackoverflow 问题的引用: 为什么 QPainter::drawPoint 绘制水平线段?

这似乎是这里提交的 Qt 中的一个错误: QPainter::drawPoints draws line segments instead of points

正如评论中指出的那样,可以通过编写自己的绘图点代码、修补 Qt、绘制图像而不是点或使用 drawEllipse 来克服这个错误。


推荐阅读