QGraphicsView:禁用自动滚动

时间:2011-01-14 09:42:58

标签: qt scroll qgraphicsview

我希望有一个永远不会自动滚动的QGraphicsView。

类似:基本上,我的问题与http://developer.qt.nokia.com/forums/viewthread/2220相同,但该主题没有得到答案。

到目前为止我尝试过:

  • 在showEvent()和resizeEvent()中,我执行ui-> graphicsView-> fitInView(...),只要项目没有超出屏幕矩形就可以正常工作
  • 我也尝试过操纵视图变换,但除了缩放之外,它的系数永远不会改变,所以这也没用,
  • Diabling滚动条外观也没有帮助

另见http://doc.qt.io/qt-4.8/qgraphicsview.html

6 个答案:

答案 0 :(得分:7)

我的解决方案有点粗略,但我认为这非常直观:如果你不想让QGraphicsView滚动你的东西,请覆盖虚拟方法scrollContentsBy。

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

答案 1 :(得分:4)

我找到了一个解决方案(不要犹豫,发布您的替代方案:)),我仍然认为这个答案可能会有所帮助,因为我在谷歌和文档上挣扎了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);
}

答案 2 :(得分:2)

我通过致电

找到了完美的解决方案
QGraphicsView::setSceneRect(yourScene->sceneRect()) 

在视图的构造函数中,自动滚动行为已停止。

答案 3 :(得分:2)

当然,使用setSceneRect()的解决方案是正确的,但是当有很多旧代码时,它可能太昂贵了。

我也尝试了scrollContentsBy(),但就我而言,这影响了场景定位。

所以我得出以下解决方案:

class GraphicsView : public QGraphicsView
{
protected:
    void wheelEvent(QWheelEvent*) override {}
    void keyPressEvent(QKeyEvent* e) override { QWidget::keyPressEvent(e); }
};

答案 4 :(得分:1)

view->setDragMode(QGraphicsView::NoDrag); 为我做了诀窍。

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

答案 5 :(得分:0)

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

view->setEnabled(false);

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