在 QT 中 "ui->scrollArea->horizontalScrollBar()->setValue(0)" 没有效果

In QT "ui->scrollArea->horizontalScrollBar()->setValue(0)" has no effect

因此,在我的 UI 设计器中,我有一个 ScrollArea 小部件,然后在我的 MainWindow.cpp 中,我创建了一个 QGraphicScene 和一个 QGraphics 视图。我创建了一个新的小部件并为该小部件提供了一个 QVBoxLayout 以便它可以自动调整大小(这对我来说是正确的)。

然后我使用 ui->scrollArea->setWidget(widget); 使这个新小部件成为我的 scrollView 的子部件。

所有这一切似乎都是正确的,因为我有滚动条可以用来导航我的场景。然而;使用行 ui->scrollArea->horizontalScrollBar()->setValue(0); 仍然对滚动条值没有影响。

scene = new QGraphicsScene();
scene->setSceneRect(0,0,2500,2500);
view = new QGraphicsView(scene);

QWidget *widget = new QWidget;
view->setBackgroundBrush(Qt::white);
QVBoxLayout* bLayout = new QVBoxLayout(widget);
ui->scrollArea->setWidget(widget);

bLayout->addWidget(view);

widget->show();

ui->scrollArea->horizontalScrollBar()->setValue(0);
ui->scrollArea->verticalScrollBar()->setValue(0);

如果您确定要解决正确的滚动条(如 thuga 评论中所指出的),也许检查您的滚动区域是否在该初始化之后被修改。我的意思是我不确定行为,但是如果您修改了小部件中的某些文本,我认为滚动条会受到影响。

您可能需要捕获您的小部件的某些事件才能重新应用这些事件:

ui->scrollArea->horizontalScrollBar()->setValue(0);
ui->scrollArea->verticalScrollBar()->setValue(0);

如果没有帮助,您应该尝试通过使用

跟踪滚动条值来进行调试
ui->scrollArea->verticalScrollBar()->value()

看看你的设置是否被很好地应用,也许什么时候被覆盖

以防万一,您也可以尝试此处指出的一些方法,但它可能与您的问题无关:setValue of ScrollBar Don't work at first time

我刚遇到这个问题。然后,在用 ui->scrollArea->verticalScrollBar()->value() 调试后,我意识到在组件显示在屏幕上之前滚动区域没有大小,即它不会改变滚动,因为它还不可见。

这是一个示例 Python 代码,但对于 C++ 来说是一样的,除了语言语法。

from PyQt5.QtWidgets import QDialog
...

    dialog = QDialog()
    ...

    verticalScrollBar = dialog.QPlainTextEdit.verticalScrollBar()
    horizontalScrollBar = dialog.QPlainTextEdit.horizontalScrollBar()

    # Has no effect, if you print the values, you will see always 0
    verticalScrollBar.setValue( horizontalScrollBar.maximum() )
    horizontalScrollBar.setValue( horizontalScrollBar.minimum() )

    dialog.show()

    # Now it has effect
    verticalScrollBar.setValue( horizontalScrollBar.maximum() )
    horizontalScrollBar.setValue( horizontalScrollBar.minimum() )
  1. Autoscroll PyQT QTextWidget