2012-05-22 2 views
4

Qt에서 impoly (matlab)와 비슷한 함수를 만들려고합니다. 지금, 나는를 QGraphicsView의 서브 클래스를 가지고로 "drawBackground"가상 기능을 설정 한 :QGraphicsView 서브 클래 싱 및 drawBackground 설정

void roiwindow::drawBackground(QPainter *painter, const QRectF &rect) 
{ 
painter->save(); 
painter->drawImage(rect, *refimage); 
painter->restore(); 
} 

이 위대한 작품을 내가 멀리 배경 레이어로 정확하게 원하는 기본적으로. 자, 결국 폴리곤의 노드 역할을하는 원을 추가하려고합니다. 나는 이것을 사용하여 이것을했다 :

QGraphicsView *view = new QGraphicsView(this); 
view->show(); 
QGraphicsEllipseItem *e1; 
e1 = this->addEllipse(20, 20, 30, 30, QColor(0, 0, 0), Qt::white); 
e1->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsMovable); 

이것은 내가 원하는 것이다. 하지만 타원을 클릭하여 끌면 타원의 배경이 * 리 이미지의 축소 된 버전이됩니다 ... 이것은 화면 전체에 일종의 줄무늬를 남기지 만 다른 창을 클릭하면 사라집니다. 창을 최소화하십시오. QGraphicsItem도 drawBackground를 호출합니까? 그렇다면 항목이 드래그 될 때만 호출하는 것 같습니다. 이 코드를 더 잘 코딩 할 수있는 방법에 대한 제안 사항이 있습니까? 감사.

+0

printf 문을 추가하기 만하면 항목을 드래그 할 때 drawbackground 함수가 호출됩니다. – Justin

답변

4

당신은 아마를 QGraphicsView 기본 viewport update mode에 설정 한 때문에 줄무늬가 발생하고, 이는 QGraphicsView::MinimalViewportUpdate입니다. 이 경우 QGraphicsView::FullViewportUpdate이 필요합니다. 그 이유는 사용자가 항목을 이동할 때 그 뒤에있는 배경을 다시 그려야하지만 MinimalViewportUpdate을 설정하면 해당 항목 만 다시 그려집니다 (창을 최소화/최대화하는 것과 같이 전체 뷰포트 업데이트가없는 경우) .

+0

모든 업데이트에서 전체 이미지의 크기가 조정되고 그려지기 때문에 가능하지만 느려질 수 있습니다. – leemes

+0

@leemes 장면에 항목이 많으면 반드시 느려질 필요는 없습니다. 장면에 항목이 거의없는 경우 속도 차이는 거의 눈에 띄지 않으면 무시할 수 있습니다. – Anthony

+0

항목이 많은 크기 1k x 1k 픽셀의 장면을 상상해보십시오. 이제 크기가 20 x 20 픽셀 인 항목을 5 픽셀 씩 이동합니다.> 크기를 변경 한 배경 이미지의 100 픽셀에 비해 1M 픽셀을 다시 그리는 데 10000 배와 다른 항목을 다시 그립니다. 드래그 된 항목을 부드럽게 움직이기 위해서는 문제가 될 수 있습니다. 하지만 나는 그것이 사건에 달려 있다고 생각합니다 ... – leemes

2

QGraphicsView::drawBackground 언제든지 그래픽 뷰의을 다시 그려야합니다. 이 은 성능 향상을 위해 전체보기보다 작을 수 있습니다.

예 : 직사각형 항목이있는 경우 더 큰 장면 /보기 내에서 50 x 50 픽셀이라고 가정하고이 직사각형을 오른쪽으로 20 픽셀 이동하면 이전 + 새 위치로 덮인 영역 만 항목 (70 x 50 픽셀)이 다시 그려집니다 (변경되는 영역이므로). drawBackground 당신의 재 구현에

, 당신은 말 : 실제로이 지역에서와 의 크기에 이미지를 그립니다

painter->drawImage(rect, *refimage); 

업데이트 뷰 아닌 전체 크기 할 수 있습니다.

painter->drawImage(0, 0, *refimage); 
: 같은 위치에 때마다 이미지를 그릴 수와 같은 크기에, 당신은 일정한 위치 (예를 들어 원점)를 사용할 수 있으며, 이미지의 크기를 변경하지 마십시오 위해

또는 장면의 전체 영역을 사용할 수 있습니다 sceneRect()이 장면은 전체 장면에 사용하는 것과 같은 RECT으로 정의된다

painter->drawImage(sceneRect(), *refimage); 

. 이 rect는 rect 밖의 새로운 내용을 추가하면 자동으로 업데이트됩니다. 또한, 예를 들어, 수동으로 값을 설정하여 장면 RECT를 강제 할 수

scene()->setSceneRect(0, 0, 800, 800); 

이 문서를 참조하십시오 : QGraphicsView::sceneRectQGraphicsScene::sceneRect

+0

응답 해 주셔서 감사합니다. 나는 그것을 시도하고 위대한 작품.유일한 문제는 배경이 창 크기에 비례하지 않는다는 것입니다. 크기를 조정할 수있는 창 크기를 원합니다.하지만 문제가 도로를 따라 가면이 솔루션으로 돌아갈 수 있습니다. 응답 해 주셔서 감사합니다. – Justin

+0

배경을 정적이고 스크롤에 독립적으로, 즉 장면 위치가 아닌 화면 크기와 동일한 화면 위치 (그리고 보이는보기의 크기)로 항상 그려야합니까? 그렇다면 이것은 올바른 해결책이 아닙니다. – leemes