我试图在QGraphicsView::drawBackground
上正确显示网格图案。在尝试移动添加到场景中的项目之前,一切似乎都能正常工作。
我在MainWindow中添加这样的行:
QPen _Pen;
_Pen.setColor(Qt::red);
_Pen.setWidth(3);
QGraphicsLineItem* _Line=new QGraphicsLineItem(0,0,100,100);
_Line->setPen(_Pen);
_Line->setVisible(true);
_Line->setFlags(QGraphicsLineItem::ItemIsSelectable | QGraphicsLineItem::ItemIsMovable);
m_scene->addItem(_Line);
GraphicsView的方法:
GraphicsView::GraphicsView() : cellSize(20)
{
setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
}
void GraphicsView::drawBackground(QPainter *p, const QRectF &crect)
{
p->save();
p->setPen(QPen(Qt::black,1));
for (int x = crect.topLeft().x(); x < crect.bottomRight().x(); x += cellSize)
for (int y = crect.topLeft().y(); y < crect.bottomRight().y(); y += cellSize)
p->drawPoint(x, y);
p->restore();
}
问题可以在这里看到:
当我移动项目时,它会在其后面留下一些网格点,这些网格点与原始网格不对齐。
我不明白这个错误来自哪里。我做错了什么?
答案 0 :(得分:0)
您在drawBackground
中提供的区域并不总是完整视图。当场景中的某些内容发生变化时,您只会获得重绘的相关区域。而且你是从不同“移动”区域的左上角开始的。
解决此问题的一种方法是制作x
的初始y
和cellSize
倍数:
for (int x = (int)crect.left()/cellSize*cellSize; x < crect.right(); x += cellSize)
for (int y = (int)crect.top()/cellSize*cellSize; y < crect.bottom(); y += cellSize)
答案 1 :(得分:0)
我可以想到两个可能的问题:
1)更改视图更新模式。选项描述为here 这应该有效:
setViewportUpdateMode(SmartViewportUpdate);
2)涂抹可能是由项目的项目边界矩形太小而导致的。
(我意识到这个问题已经过时了,但也许会帮助其他人)