首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPainter drawLines方法

QPainter drawLines方法
EN

Stack Overflow用户
提问于 2016-02-20 08:08:37
回答 1查看 1.5K关注 0票数 0

我使用以下代码在qt中绘制图形的轴:

代码语言:javascript
复制
...

static const std::array<const QPointF,10*2> horizontalAxis = {
    QPointF(0.f,0.f), QPointF(1.f,0.f),
    // Horizontal scales
    QPointF(0.f,0.f), QPointF(0.f,1.f),
    QPointF(0.125f,0.f), QPointF(0.125f,1.f),
    QPointF(0.25f,0.f), QPointF(0.25f,1.f),
    QPointF(0.375f,0.f), QPointF(0.375f,1.f),
    QPointF(0.5f,0.f), QPointF(0.5f,1.f),
    QPointF(0.625f,0.f), QPointF(0.625f,1.f),
    QPointF(0.75f,0.f), QPointF(0.75f,1.f),
    QPointF(0.875f,0.f), QPointF(0.875f,1.f),
    QPointF(1.f,0.f), QPointF(1.f,1.f)
};

static const std::array<const QPointF,6*2> verticalAxis = {
    QPointF(0.f,0.f), QPointF(0.f,1.f),
    // Vertical scales
    QPointF(0.f,0.f), QPointF(-1.f,0.f),
    QPointF(0.f,0.25f), QPointF(-1.f,0.25f),
    QPointF(0.f,0.5f), QPointF(-1.f,0.5f),
    QPointF(0.f,0.75f), QPointF(-1.f,0.75f),
    QPointF(0.f,1.f), QPointF(-1.f,1.f)
};

...

void Plot::paint(QPainter& p)
{
    int const width = p.device()->width();
    int const height = p.device()->height();
    Q_ASSERT(width > xpaddingLeft + xpaddingRight);
    Q_ASSERT(height > ypaddingTop + ypaddingBottom);

    if(dirty) {
        recalculate();
    }

    p.save();

    int const bottomLeftX = xpaddingLeft;
    int const bottomLeftY = height - ypaddingBottom;
    int const scaleX = width - xpaddingLeft - xpaddingRight;
    int const scaleY = height - ypaddingTop - ypaddingBottom;

    p.setRenderHint(QPainter::HighQualityAntialiasing,false);
    p.setRenderHint(QPainter::Antialiasing,false);

    QPen pen(QBrush(QColor::fromRgb(0,0,0)), 2);
    pen.setCosmetic(true);  // Do not apply scale to the pen
    p.setPen(pen);

    // Horizontal Axis
    p.resetTransform();
    p.translate(bottomLeftX,bottomLeftY);   // Origin at bottom left
    p.scale(scaleX,scaleSize); // y-axis points down. Only scale y to match the scale-mark size
    p.drawLines(&horizontalAxis[0], (int)horizontalAxis.size());

    // Vertical Axis
    p.resetTransform();
    p.translate(bottomLeftX,bottomLeftY);
    p.scale(scaleSize,-scaleY); // y-axis points up. Only scale x to match the scale-mark size
    p.drawLines(&verticalAxis[0], (int)verticalAxis.size());

    ...
}

这将产生如下图形,并带有lhs的一个奇怪的工件(只显示没有加载数据的轴):

水平轴尺度导致LHS出现奇怪的伪影。

注释掉所有用于水平比例定义的QPointF定义将删除这个奇怪的工件。然而,评论任何一个单独的点似乎不影响它。如果我不使用drawLines()方法,如下所示,拉伸就会消失。

代码语言:javascript
复制
    //p.drawLines(&horizontalAxis[0], (int)horizontalAxis.size());
    for(size_t k = 0; k < horizontalAxis.size()-1; k += 2) p.drawLine(horizontalAxis[k],horizontalAxis[k+1]);

结果如下所示,没有任何工件(只显示没有加载数据的轴):

水平轴刻度显示无开关

我是遗漏了什么,还是drawLines()中的一个bug?

我两次使用drawLines()函数来绘制垂直轴和实际数据(如直线图),而不存在(明显的)问题,但我希望更确定的是,在我还没有进行测试的情况下,它不会产生奇怪的工件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-20 09:01:26

您正在使用的drawLines()重载是(来自Qt5文档):

代码语言:javascript
复制
QPainter::drawLines (const QPointF* pointPairs, int lineCount)

请注意第二个参数。它被称为lineCount,而不是点计数,所以您必须传递一半的点数:

代码语言:javascript
复制
assert (0 == horizontalAxis.size () % 2);
p.drawLines (&horizontalAxis[0], static_cast<int> (horizontalAxis.size () / 2));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35520704

复制
相关文章

相似问题

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