qt获取滚动视图位置

Posted

技术标签:

【中文标题】qt获取滚动视图位置【英文标题】:qt get scrollview position 【发布时间】:2011-07-21 03:20:02 【问题描述】:

我在水平布局中有一个 QGraphicsView。 QGraphics 场景中包含的 QGraphicsScene 非常大(数千像素),因此默认显示滚动条以允许我滚动浏览视图。

每次更新图形场景中的场景时,我都会删除旧场景,创建一个新场景,用对象填充它,然后调用 view->setScene(scene)。但是,当我这样做时,滚动条默认位于 QGraphicsView 的左上角,而不是停留在它们所在的位置。

我尝试在销毁场景之前保存 QGraphicsScene::sceneRect,然后执行 setSceneRect() 来恢复它,但这不起作用,因为这只影响场景本身,而不是显示它的 QGraphicsView。我也尝试过查看->verticalScrollBar()->setValue(),但这似乎根本不会影响滚动条。

如何访问默认为我创建的滚动条,并将它们设置为之前存储的值?

【问题讨论】:

更新场景时发生了什么需要删除并重新创建? 【参考方案1】:

在设置新场景之前不会删除之前的场景。

例如

QGraphicsScene *previousScene = scene;
scene = new QGraphicsScene(0, 0, levelPlist.value("level_width").toInt(), levelPlist.value("level_height").toInt());

// config scene

QGraphicsView *view = ui->graphicsView;
view->setScene(scene);

delete previousScene;

【讨论】:

【参考方案2】:

在给出可能的解决方案之前,我强烈推荐一种不涉及破坏场景的方法。如果您只是清除()您的场景,您应该能够在清除它之前调用 setSceneRect(),这将防止场景自动调整其矩形大小。重新填充后,您可以使用默认构造的 QRect 调用 setSceneRect() 以再次控制矩形的大小。

如果您真的需要按说明保存/恢复滚动条,过去我可以使用以下方法:

我不得不做类似的事情(出于不同的原因),而我想出的最佳解决方案包括做这样的事情:

在清除场景之前,保存垂直和水平滚动条的位置 在重建场景之前,使用 queued 信号/插槽连接连接到 QScrollBar::rangeChanged() 信号。在您重新填充场景后应该会触发此信号,它表示视图已重新配置滚动条。 在您的插槽中,断开 rangeChanged() 信号,并恢复滚动条位置

请注意,这几乎肯定会导致一些闪烁/跳跃。

【讨论】:

以上是关于qt获取滚动视图位置的主要内容,如果未能解决你的问题,请参考以下文章

将列表视图滚动到新添加项目的位置

如何在qt中同时移动滚动条

WPF RichTextBox 如何滚动到光标所在位置滚动条操作

在Subview位置选择滚动视图子视图滚动

停止 Qt QGraphicsView 在重新调整大小时滚动

如果视图超出屏幕上可见的当前高度,则拖动视图并滚动