我希望有一个永远不会自动滚动的QGraphicsView。
类似:基本上,我的问题与http://developer.qt.nokia.com/forums/viewthread/2220相同,但该主题没有得到答案。
到目前为止我尝试过:
答案 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);
这也会阻止它滚动,但它也不会再接收鼠标或键盘事件。