2012-10-19 184 views
1

我無法弄清楚如何使centerOn()圍繞項目視移動(或圍繞港口的項目,不知道這是哪條路)。QGraphicsView-> centerOn()不工作

下面的代碼做的主要工作有:

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(這樣做)什麼:

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); 
} 

我錯過了什麼? 謝謝

亞歷

+0

嘗試重新實現功能drawForeground代替的paintEvent。這是通常的方式,你可以在視圖中弄亂事物。我猜測在paintEvent運行時沒有繪製視圖,並且因爲座標30.0和50.0不是有效的視圖 – Castilho

+0

對不起,以前沒有響應。我今晚會檢查一下,讓你知道。謝謝。 – Alex

回答

2

你基本上拉的paintEvent號召下的地毯。

的QGraphicsView通過的信號和槽路QGraphicsScene連通。由於在創建後立即調用實際的paintEvent,場景沒有機會通知視圖添加了新項目。這兩個步驟之間沒有事件循環過程。因此,paintEvent調用沒有爲新項目正確設置,更不用說居中更改。

而且一旦畫完成後,查看驗證,認爲這一切都畫。所以它永遠不會更新新項目的區域。任何繪畫或更新事件之外

呼叫centerOn。

+0

對不起,以前沒有回覆。聽起來很合理,儘管該項目確實更新並繪製在paintEvent中。我今晚會檢查一下,讓你知道。謝謝。 – Alex

+0

從MouseMoveEvent正常工作。謝謝 – Alex

0

我通過放置一個高值上setSceneRect解決了這個問題。 然後,我將場景集中在一個對象或位置上。

例如:

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

隨着setSceneRect大小GraphicsView不工作的權利。