添加小部件后 QScrollArea 不会滚动到最大值

Luk*_*kas 6 layout qt4 qscrollarea

我的设置如下所示:

Main Window
  |- QHBoxLayout
       |- Some Widgets
       |- QScrollArea
       |    |- QHBoxLayout
       |         |- QGridLayout
       |              |- Widgets dynamically loaded in at runtime
       |         |- QVBoxLayout
       |- Some Widgets
Run Code Online (Sandbox Code Playgroud)

添加小部件后,我希望滚动区域完全向下滚动。我这样做了:

this->ui->gridLayout_table->addWidget(/*Widget*/); // this works perfectly nice
this->ui->gridLayout_table->addWidget(/*Widget*/); // this also works perfectly nice
this->ui->scrollArea->verticalScrollBar()->setValue(this->ui->scrollArea->verticalScrollBar()->maximum());
Run Code Online (Sandbox Code Playgroud)

在最后一个命令中,它滚动到最大值减去新添加的小部件的高度。有没有办法在滚动之前刷新更改?

提前致谢 卢卡斯

Tra*_*son 8

rangeChanged方法的Python 版本:

scroll_area = QtGui.QScrollArea()
scroll_bar = scroll_area.verticalScrollBar()
scroll_bar.rangeChanged.connect(lambda: scroll_bar.setValue(scroll_bar.maximum()))
Run Code Online (Sandbox Code Playgroud)

通过将rangeChanged方法连接到向下滚动,它确保每次范围发生变化时,滚动条都会向下滚动到最大值。

来源


Til*_*gel 0

嗯,我没有答案,也有同样的问题。不过,我可以提供一个小的重现示例:

#include <QtGui>

class TestWidget : public QWidget
{
    Q_OBJECT

public:
    TestWidget(QWidget * parent = 0);

private slots:
    void addButton();

private:
    QScrollArea * scrollArea;
    QWidget * contents;
    QVBoxLayout * contentsLayout;
};

TestWidget::TestWidget(QWidget * parent)
    : QWidget(parent)
{
    QVBoxLayout * layout = new QVBoxLayout(this);
    scrollArea = new QScrollArea(this);
    layout->addWidget(scrollArea);

    contents = new QWidget(this);
    scrollArea->setWidget(contents);
    contents->resize(300,400);
    scrollArea->setWidgetResizable(true);

    contentsLayout = new QVBoxLayout(contents);
    for (int i = 0; i < 10; ++i)
    {
        QPushButton * button = new QPushButton(QString("button %1").arg(i), this);
        connect(button, SIGNAL(clicked()), this, SLOT(addButton()));
        contentsLayout->addWidget(button);
    }

}

void TestWidget::addButton()
{
    QPushButton * button = new QPushButton("button", this);
    connect(button, SIGNAL(clicked()), this, SLOT(addButton()));
    contentsLayout->addWidget(button);
    QScrollBar * scrollBar = scrollArea->verticalScrollBar();
    scrollBar->setValue(scrollBar->maximum());
}

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    TestWidget widget;
    widget.show();

    app.setQuitOnLastWindowClosed(true);

    return app.exec();
}

#include "main.moc"
Run Code Online (Sandbox Code Playgroud)

Qt 4.8 和 5.2 都会出现该问题(需要对示例进行少量修改)。