2010-05-06 4 views
2

QGraphicsScene에서 안티 앨리어싱없이 배경 눈금을 그리는하려고 할 때 : 나는이 켜지지 않는 한,유물 내가 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); 
} 

그러나 앤티 앨리어싱을 사용하면 주위의 항목을 이동하면 그리드에 아티팩트가 남을 수 있습니다 (그려지지 않은 부분). 보기가 약간 축소되면 낮은 줌 레벨에서 주로 발생합니다. 내가 여기서 잘못하고있는 아이디어가 있습니까?

라인이 엄격하게 수평 및 수직이므로 앤티 앨리어싱을 켜고 싶지는 않을 것입니다. 가능한 한 선명하게 보이기를 바랍니다.

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

아마도 배경 캐싱 :

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

어떤 도움이 많이 다른 뷰포트 업데이트 방법을 사용할 필요가 같은

+0

그림을 그리기 전에 장면의 내용을 명시 적으로 지우려고 했습니까? 눈금 선을 그리기 전에 흰색 직사각형 (또는 배경색이 무엇이든간에)을 그려보고 도움이되는지 확인하십시오. – Thomi

+0

먼저 기본 클래스 함수를 호출 해 보았습니까? 어쩌면 배경을 먼저 지우는 것이 좋습니다 :'QGraphicsScene :: drawBackground (painter, rect)'그리고 모든 사용자 정의 코드. –

+0

프로그램 시작시 setViewportUpdateMode (QGraphicsView :: FullViewportUpdate)를 호출 해 보았습니까? – Tom

답변

2

는 소리, 엘비스을 감사를 appriciated됩니다

+0

필자는 smiliar 문제가있어 "setViewportUpdateMode (QGraphicsView :: FullViewportUpdate)"를 추가 한 후에 수정되었지만 성능에 어떤 영향이 있는지 확실하지 않습니다. – Vincent

+0

전체 업데이트를 사용하는 것보다 나은 해결책이있는 내 질문을 확인하십시오. http://stackoverflow.com/questions/13933699/qgraphicslineitempaint-artifacts – paulm

관련 문제