如何确保显示QScrollArea中的整个区域?

时间:2013-11-27 14:51:11

标签: qt

我在QScrollArea中向用户显示一些信息。 用户应该看到所有内容,然后才能继续(至少内容应该滚动到最后) 我怎么能轻易地发现这个?

重新实现virtual void scrollContentsBy (int dx,int dy)是唯一的方法吗?

修改

我能够解决它,但不得不使用一些解决方法:

  1. 信号actionTriggered(int)发送的滚动动作值从未具有值QAbstractSlider :: SliderToMaximum(Qt4.8,Windows 7)。如果滑块值接近最大值,我手动检查。
  2. 即使滚动条小部件被鼠标拖动到底部,滚动条的值也不会是最大值。仅当滚动条小部件被任何其他事件(例如向下箭头或鼠标滚轮)移动时,该值才可能变为最大值。我已经用recheckPosition()
  3. 工作了

    我希望,有更好的解决方案。

    void NegativeConfirmation::recheckPosition()
    {
        processScrollAction(1);
    }
    
    void NegativeConfirmation::processScrollAction( int evt)
    {
    
    if ( evt == QAbstractSlider::SliderToMaximum) // Have not managed to receive this action
    {
        ui->bConfirm->setEnabled(true);
    }
    
    //Another approach
    QWidget * sw = ui->scrollArea->widget();
    if ( sw ) //any content at all ?
    {       
        QScrollBar * sb = ui->scrollArea->verticalScrollBar();
        if ( sb ) 
        {           
            int sbv = sb->value();
            int sbm = sb->maximum()-10;
            if ( sbm>0 && sbv >= sbm )
            {
                ui->bConfirm->setEnabled(true);             
            }
            else
            {
                QTimer::singleShot(1000, this, SLOT(recheckPosition()));
            }
        }
    }
    

    }

1 个答案:

答案 0 :(得分:1)

QScrollArea继承提供此信号的QAbstractSlider: -

void QAbstractSlider::actionTriggered(int action)

行动可以是 QAbstractSlider :: SliderToMaximum

我希望你可以连接到这个信号并测试动作是QAbstractSlider :: SliderToMaximum,表示用户已经滚动到底部。