2012-10-19 2 views
1

centerOn()을 사용하여 뷰포트를 항목 (또는 포트 주변의 항목)으로 이동하는 방법을 알 수 없습니다.QGraphicsView-> centerOn()이 작동하지 않습니다.

다음 코드는 메인에서 작업을 수행합니다

class MyView :: public QGraphicsView { ... } 

void MyView::init(){ 
    ... 
    setDragMode(QGraphicsView::ScrollHandDrag); 
    setFrameStyle(QFrame::NoFrame); 
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 

    _scene.clear(); 
    setScene(&_scene); 

    super::showNormal(); 

} 


void MyView::paintEvent(QPaintEvent *aEvent){ 
    _scene.clear(); 
    QGraphicsPixmapItem *pmItem = new QGraphicsPixmapItem(pixMap); 
    _scene.addItem(pmItem); 
    centerOn(QPointF(50.0, 30.0)); 

    super::paintEvent(aEvent); 
} 
:

view.setDragMode(QGraphicsView::ScrollHandDrag); 
view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
view.setFrameStyle(QFrame::NoFrame); 
view.showFullScreen(); 

QGraphicsPixmapItem *pmItem = new QGraphicsPixmapItem(pixMap); 
scene.addItem(pmItem); 

view.centerOn(QPointF(50,30)); 
view.show(); 
rc = qA.exec(); 

을하지만, centerOn는() 오버로드를 QGraphicsView의 나는 paintEvent (에서 동일한 작업을 수행하려고 아무것도)하지 않습니다

무엇이 놓칠까요? 당신은 기본적으로 paintEvent 통화에서 양탄자를 당겨 당신

알렉스

+0

paintEvent 대신 drawForeground 함수를 다시 구현하십시오. 그것은보기에 사물을 엉망이게하는 일반적인 방법입니다. 나는 paintEvent가 실행될 때 뷰가 그려지지 않는다고 추측하고 있습니다. 왜냐하면 좌표 30.0과 50.0이 유효한 것들이 아닙니다. – Castilho

+0

일찍 응답하지 않아 죄송합니다. 오늘 밤 이것을 확인하고 알려 드리겠습니다. 고맙습니다. – Alex

답변

2

감사드립니다.

QGraphicsView는 신호와 슬롯을 통해 QGraphicsScene과 통신합니다. 장면은 생성 직후 실제 paintEvent가 호출되기 때문에 새 항목이 방금 추가되었다는 사실을보기에 알릴 기회가 없습니다. 2 단계 사이에는 이벤트 루프 프로세스가 없습니다. 따라서 paintEvent 호출에는 새 항목에 대한 설정이 제대로되어 있지 않습니다.

그리고 그림이 완료되면보기의 유효성을 검사하고 그림이 모두 그렸다고 생각합니다. 따라서 새 항목의 영역을 업데이트하지 않습니다.

페인팅 또는 업데이트 이벤트의 외부에서 centerOn을 호출하십시오.

+0

일찍 응답하지 않아 죄송합니다. 아이템이 실제로 업데이트되어 paintEvent에 페인트되었지만 합리적으로 들립니다. 오늘 밤 이것을 확인하고 알려 드리겠습니다. 고맙습니다. – Alex

+0

MouseMoveEvent에서 올바르게 작동합니다. 감사 – Alex

0

setSceneRect에 높은 값을 넣어서이 문제를 해결했습니다. 그런 다음 장면을 대상이나 위치에 집중시킵니다.

예 : setSceneRect 크기 GraphicsView

this->ui->graphicsView->setSceneRect (0,0,100000000, 100000000); 
this->ui->graphicsView->centerOn(500,1030); 

바로 작동하지 않습니다.

관련 문제