Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QGraphicsView中的格网故障::牵引地面_C++_Qt_Qgraphicsview - Fatal编程技术网

C++ QGraphicsView中的格网故障::牵引地面

C++ QGraphicsView中的格网故障::牵引地面,c++,qt,qgraphicsview,C++,Qt,Qgraphicsview,我正在尝试在QGraphicsView::trackground上正确显示网格模式。在我尝试移动添加到场景中的项目之前,一切似乎都正常 我在MainWindow中添加如下行: QPen _Pen; _Pen.setColor(Qt::red); _Pen.setWidth(3); QGraphicsLineItem* _Line=new QGraphicsLineItem(0,0,100,100); _Line->setPen(_Pen); _Line

我正在尝试在
QGraphicsView::trackground
上正确显示网格模式。在我尝试移动添加到场景中的项目之前,一切似乎都正常

我在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() : 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();
}
GraphicsView::GraphicsView():单元格大小(20)
{
setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
}
无效图形视图::牵引地面(QPainter*p、const QRectF和crect)
{
p->save();
p->setPen(QPen(Qt::黑色,1));
对于(int x=corct.topLeft().x();x绘图点(x,y);
p->restore();
}
这里可以看到问题:

当我移动项目时,它会在其后面留下网格点的轨迹,这些网格点与原始网格不对齐


我不明白这个错误是从哪里来的。我做错什么了吗?

牵引地
中给出的区域并不总是全视图。当场景中的某些内容发生更改时,您将只获得要重绘的相关区域。从不同“移动”区域的左上角开始

解决此问题的一种方法是将初始的
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)
for(int x=(int)crect.left()/cellSize*cellSize;x
我可以想到两个可能的问题:

  • 更改视图更新模式。描述了这些选项

    setViewportUpdateMode(SmartViewportUpdate)
    setViewportUpdateMode(FullViewportUpdate)

  • 拖影可能是由于项目的项目边界矩形太小半个像素造成的

  • (我知道这个问题很老,但也许它会帮助其他人)