首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么QPainter标度(化妆品)点在一个轴上,尽管它们不应该受到影响?

为什么QPainter标度(化妆品)点在一个轴上,尽管它们不应该受到影响?
EN

Stack Overflow用户
提问于 2018-09-05 09:07:50
回答 1查看 523关注 0票数 1

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

Qt版本:QT4.8用于嵌入式QT5.4用于桌面QT5.6LTS用于桌面

以下是一些实际上应该看起来都一样的渲染(比如最左边的):

我有一个从RenderArea派生出来的QWidget,它简单地绘制了上面的一个图像。RenderArea只是在main()中实例化并显示出来。这里的代码很简单,下面是相关的绘画代码:

代码语言:javascript
运行
复制
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附带的基本绘图示例,但为了突出问题,我剥离了所有内容。

  • 为何会出现这个问题呢?
  • 为什么它只出现在一个轴上?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-31 13:38:06

要结束这个主题,我想添加一个对另一个堆栈溢出问题的引用:为什么QPainter::drawPoint画一个水平线段?

它似乎是Qt中的一个bug,它在这里归档:QPainter::延点画线段代替点

正如注释中指出的那样,可以通过为绘图点编写自己的代码、修补Qt、绘制图像而不是点或使用drawEllipse来克服此缺陷。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52181274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档