3

我不知道如何让 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);
}

我想念什么?谢谢

亚历克斯

4

2 回答 2

2

您基本上可以在paintEvent 调用下拉开地毯。

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

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

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

于 2012-10-19T05:25:43.830 回答
1

我通过在setSceneRect. 然后我将场景集中在一个对象或位置上。

例子:

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

setSceneRect大小不合适GraphicsView

于 2014-04-17T20:19:59.220 回答