2011-01-14 191 views
6

我想拥有一个从不自动滚动的QGraphicsView。QGraphicsView:禁用自动滚动

相似:基本上,我的问题与http://developer.qt.nokia.com/forums/viewthread/2220完全相同,但该线程没有收到答案。

我迄今为止尝试:

  • 在showEvent()和resizeEvent(),我做的用户界面 - > graphicsView-> fitInView(...),其中长细如项目不适用冲过屏幕矩形
  • 我还试图操纵视图变换,但除了缩放它的系数永远不会改变,所以这是无果而终,太
  • Diabling滚动条的外观并没有帮助,也

另请参阅http://doc.qt.io/qt-4.8/qgraphicsview.html

回答

3

我找到了一个解决方案(不要犹豫,发布您的替代品:)),我仍然认为这个答案可能会有帮助,因为我在谷歌和文档上挣扎了15个小时。

关键是不仅要调用fitInView(),还要调用setSceneRect()。这为我做(用你自己的类名称替换FooBar的):

void FooBar::resizeEvent(QResizeEvent *) { 
     fitView(); 
} 

void FooBar::showEvent(QShowEvent *) { 
     fitView(); 
} 

void FooBar::fitView() { 
     const QRectF rect = QRectF(-0.5,-0.5, 1, 1); 
     ui->graphicsView->fitInView(rect, 
            Qt::KeepAspectRatio); 
     ui->graphicsView->setSceneRect(rect); 
} 
7

我的解决办法是有点模糊,但我认为这是非常直观的:如果你不希望的QGraphicsView永远滚动你的东西,覆盖虚拟方法scrollContentsBy。

void QGraphicsViewDerived::scrollContentsBy(int, int) 
{ 
    //don't do anything hah! 
} 
0

另一种简单的解决方案,如果不需要的交互性,是禁用的QGraphicsView:

view->setEnabled(false); 

这也将防止它滚动,但它也不会接收鼠标或键盘事件不再。

1

view->setDragMode(QGraphicsView::NoDrag); 为我做了诡计。

anonvt的解决方案也起作用,只是它干扰了场景的清爽。

1

我找到了完美的解决方案,在您的视图的构造函数调用

QGraphicsView::setSceneRect(yourScene->sceneRect()) 

,自动滚动行为停止。