QGraphicsView:禁用自动滚动

7
我想要一个QGraphicsView,它永远不会自动滚动。
类似:基本上,我的问题与http://developer.qt.nokia.com/forums/viewthread/2220相同,但该线程没有得到答案。
我到目前为止尝试过的内容:
- 在showEvent()和resizeEvent()中,我执行ui->graphicsView->fitInView(...),只要项目不超出屏幕矩形就可以正常工作。 - 我也尝试过操作视图变换,但除了缩放系数之外,它的系数从未改变,因此这也是徒劳的。 - 禁用滚动条外观也无济于事。
另请参见http://doc.qt.io/qt-4.8/qgraphicsview.html
6个回答

9

我的解决方案有些简略,但我认为它非常直观:如果您不希望QGraphicsView滚动您的内容,请覆盖虚拟方法scrollContentsBy。

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

我正在使用setTransformationAnchor(QGraphicsView::AnchorUnderMouse);。这个解决方案会导致鼠标下的缩放功能失效。 - undefined

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

当有大量的旧代码时,使用setSceneRect()解决方案是正确的,但成本可能会很高。

我也尝试了scrollContentsBy(),但在我的情况下它影响了场景定位。

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

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

1
我发现了完美的解决方案,通过调用

保留 HTML。
QGraphicsView::setSceneRect(yourScene->sceneRect()) 

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

0

view->setDragMode(QGraphicsView::NoDrag); 对我很有帮助。

anonvt的解决方案也有效,但会干扰场景的刷新。


-1

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

view->setEnabled(false);

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


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