尝试在QGraphicsScene中绘制没有消除锯齿的背景网格时的工件

时间:2010-05-06 07:05:44

标签: c++ qt

我正在尝试在QGraphicsScene子类的drawBackground()函数中绘制背景网格:

void Scene::drawBackground(QPainter *painter, const QRectF &rect)
{
    const int gridSize = 50;

    const int realLeft = static_cast<int>(std::floor(rect.left()));
    const int realRight = static_cast<int>(std::ceil(rect.right()));
    const int realTop = static_cast<int>(std::floor(rect.top()));
    const int realBottom = static_cast<int>(std::ceil(rect.bottom()));

    // Draw grid.
    const int firstLeftGridLine = realLeft - (realLeft % gridSize);
    const int firstTopGridLine = realTop - (realTop % gridSize);

    QVarLengthArray<QLine, 100> lines;

    for (qreal x = firstLeftGridLine; x <= realRight; x += gridSize)
        lines.append(QLine(x, realTop, x, realBottom));
    for (qreal y = firstTopGridLine; y <= realBottom; y += gridSize)
        lines.append(QLine(realLeft, y, realRight, y));

    //painter->setRenderHint(QPainter::Antialiasing);
    painter->setPen(QPen(QColor(220, 220, 220), 0.0));
    painter->drawLines(lines.data(), lines.size());

    // Draw axes.
    painter->setPen(QPen(Qt::lightGray, 0.0));
    painter->drawLine(0, realTop, 0, realBottom);
    painter->drawLine(realLeft, 0, realRight, 0);
}

但是,除非我打开消除锯齿功能,否则移动项目有时会在网格中留下瑕疵(未绘制的区域)。当视图缩小一点时,它似乎主要发生在低缩放级别。我在这里做错了什么想法?

我真的不想打开抗锯齿,因为线条是严格水平和垂直的,我希望它们尽可能清晰。

任何帮助都很受欢迎, 此致,猫王

1 个答案:

答案 0 :(得分:2)

听起来您需要使用不同的视口更新方法:

http://doc.qt.io/qt-5/qgraphicsview.html#viewportUpdateMode-prop

也许是后台缓存:

http://doc.qt.io/qt-5/qgraphicsview.html#cacheMode-prop