QGraphicsView-> centerOn()不起作用

时间:2012-10-19 01:28:11

标签: qt centering qgraphicsview qgraphicsitem qgraphicsscene

我无法弄清楚如何让centerOn()在项目周围移动视口(或端口周围的项目,不知道它是哪种方式)。

以下代码在main中起作用:

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

然而,当我试图从重载的QGraphicsView的paintEvent()做同样的事情时,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);
}

我想念什么? 谢谢

亚历

2 个答案:

答案 0 :(得分:2)

你基本上在paintEvent调用下拉地毯。

QGraphicsView通过信号和插槽与QGraphicsScene进行通信。由于在创建后立即调用实际的paintEvent,因此场景无法通知视图刚刚添加了新项目。两个步骤之间没有事件循环过程。因此,paintEvent调用没有为新项目正确设置,更不用说居中更改了。

一旦绘画完成,视图就会被验证并认为它已全部绘制完成。所以它永远不会更新新项目的区域。

呼叫中心在任何绘画或更新活动之外。

答案 1 :(得分:0)

我通过在setSceneRect上放置一个高值来解决这个问题。 然后我将场景集中在一个物体或位置上。

示例:

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

setSceneRect尺寸GraphicsView无效。