模拟QScrollArea Qt5的滚动

时间:2018-01-26 04:38:51

标签: c++ qt user-interface

我有以下问题: 我有QScrollArea,里面有很多QToolBut的QVBoxLayout。 QToolButtons是通过工作动态创建的,它们按如下方式添加:

QToolButton* btn = new QToolButton(ui.previewList);
btn->setCheckable(TRUE);
ui.buttonsLayout->removeItem(ui.buttonsSpacer);
ui.buttonsLayout->addWidget(btn);
ui.buttonsLayout->addItem(ui.buttonsSpacer);

有时我需要从我的程序中滚动QScrollArea以确保某些按钮的可见性,或者在添加按钮时,可以看到最后一个按钮,并且我遇到了问题。

  1. ui.previewList-> ensureWidgetVisible(btn)根本不会做任何事情。也许是因为btn不是previewList的孩子,而是VBoxLayout的孩子
  2. 当我尝试滚动到最后,那么上面的所有变体都会导致滚动,所以只是最后一个按钮(我需要看到它)就在屏幕外面,虽然我检查了调试,我首先添加按钮并调用主窗体的更新,然后我用滚动输入功能。也许我应该做些什么来强制QScrollArea重新计算其内容和滚动条限制?

    QVerticalScrollBar scrlbar = ui.previewList->verticalScrollBar();
    int max = scrlbar->maximum();
    //Variant 1
    scrlbar->setValue(max);
    scrlbar->triggerAction(QAbstractSlider::SliderMove);
    //Variant 2    
    scrlbar->setValue(max + ui.previewList->verticalScrollBar()->pageStep());
    scrlbar->triggerAction(QAbstractSlider::SliderMove);
    //Variant 3
    scrlbar->triggerAction(QAbstractSlider::SliderToMaximum);
    
  3. 那么在这种情况下处理QScrollArea的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

确定。以下是这个问题的答案。

  1. 使ensureItemVisible工作我只需要将layoutSizeConstraint设置为SetMinAndMaxSize(是的,它是用qt文档编写的,所以我可以对自己说rtfm。)

  2. 为了滚动到最大值,需要QApplication :: processEvents(),感谢@SteakOverflow了解这一点。