我无法弄清楚如何让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);
}
我想念什么? 谢谢
亚历
答案 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
无效。