6

我想要一个永远不会自动滚动的 QGraphicsView。

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

到目前为止我已经尝试过:

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

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

4

6 回答 6

8

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

void QGraphicsViewDerived::scrollContentsBy(int, int)
{
    //don't do anything hah!
}
于 2011-02-25T18:31:52.857 回答
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);
}
于 2011-01-14T09:45:49.413 回答
2

我找到了完美的解决方案,通过调用

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

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

于 2016-08-18T14:31:33.530 回答
2

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

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

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

class GraphicsView : public QGraphicsView
{
protected:
    void wheelEvent(QWheelEvent*) override {}
    void keyPressEvent(QKeyEvent* e) override { QWidget::keyPressEvent(e); }
};
于 2018-08-14T07:17:19.057 回答
1

view->setDragMode(QGraphicsView::NoDrag); 为我做了伎俩。

anonvt 的解决方案也有效,只是它干扰了场景的刷新。

于 2014-11-28T11:42:35.400 回答
0

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

view->setEnabled(false);

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

于 2014-06-08T04:56:33.327 回答