QGraphicsView->centerOn()无法工作

3

我无法弄清如何使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(); 

然而,当我尝试从重载的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);
}

我错过了什么?
谢谢
亚历克斯

尝试重新实现drawForeground函数,而不是paintEvent。这是您通常可以在视图中搞砸事情的方式。我猜测在paintEvent运行时视图没有被绘制,因此坐标30.0和50.0不是有效的坐标。 - Castilho
抱歉之前没有及时回复。我今晚会查看并告诉你。谢谢。 - Alex
2个回答

2

“你基本上在paintEvent调用下拔掉了地毯。”

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

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

在任何绘画或更新事件之外调用centerOn。


抱歉之前没有及时回复。听起来很合理,不过该项确实在 paintEvent 中进行了更新和绘制。我今晚会检查一下并让你知道结果。谢谢。 - Alex
从MouseMoveEvent中运行良好。谢谢。 - Alex

1
我通过高度重视setSceneRect来解决这个问题。然后我将场景居中于一个对象或位置。
例子:
this->ui->graphicsView->setSceneRect (0,0,100000000, 100000000);
this->ui->graphicsView->centerOn(500,1030);

使用 setSceneRect 设置大小后,GraphicsView 的工作不正确。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接