【Qt】滚动条QScroolBar实现滚屏功能

16 篇文章 2 订阅

环境:Qt5

编译器:Qt Creator


需求:如图

显示区域win 600*300

需要显示的Widget控件show 590*550

则有600*250的show界面无法显示

使用滑块控制show界面滚动显示全部内容



实现过程:

增加水平滑块verticalScroolBar (10*300)控件

注意:verticalScroolBar不要放在show控件上,而是show、verticalScroolBar两个控件同时以win界面为父界面水平摆放


第一步:实现拖拽滑块滚动show界面

连接信号与槽

声明一个滑块响应槽

private slots:
      slot_ScroolWidget(int);

connect(ui->verticalScrollBar,SIGNAL(valueChanged(int)),this,SLOT(slot_ScroolWidget(int)));

verticalScrollBar的信号valueChagned(int)发送来一个int参数

该参数指明当前滑块所在的位置

其中,滑块长度恒定为0-100,而该参数就是介于0-100之间


槽函数实现

void fun::slot_ScroolWidget(int value)
{
    double p=static_cast<double>(value)/static_cast<double>(ui->verticalScrollBar->maximum());
    ui->background->move(0,-(ui->background->height()-350)*p);
}

获得滑块的位置value

计算一个比例因子p=滑块的位置/滑块的最大位置

利用比例因子p,调用show的成员函数move来移动相应的位置



到此,滑块滚屏的基本功能已经实现了

但是,一般来说,更顺手使用鼠标滚轮来进行滚屏

所以,我们还需要重载wheelEvent()事件来实现此功能

void fun::wheelEvent(QWheelEvent *event)
{
    int para=event->angleDelta().y();//获得鼠标滚轮的滚动距离para,para<0向下滚动,>0向上滚动
    if (para<0)
    {   
        //向下滚动,设定鼠标滚轮每滚动一个单位,滑块就移动20个单位
        //加入此判断的理由是,若当时滑块处于90的位置上,一旦继续下滑20个单位,就会超过最大范围100,show界面就会移动超出范围。
        if (ui->verticalScrollBar->value()+20<=100)
        {
            //发射verticalScrollBar的信号valueChange(value+20),连接到了我们之前写的slot_ScrollWidget(int)槽上
            emit ui->verticalScrollBar->valueChanged(ui->verticalScrollBar->value()+20);verticalScrollBar的信号valueChange(value+20);
            //设定滚动之后的滑块位置
            ui->verticalScrollBar->setSliderPosition(ui->verticalScrollBar->value()+20);
        }
        else
        {
            emit ui->verticalScrollBar->valueChanged(ui->verticalScrollBar->maximum());
            ui->verticalScrollBar->setSliderPosition(ui->verticalScrollBar->maximum());
        }
    }
    else
    {
        //向上滚动
        if (ui->verticalScrollBar->value()-20>=0)
        {
            emit ui->verticalScrollBar->valueChanged(ui->verticalScrollBar->value()-20);
            ui->verticalScrollBar->setSliderPosition(ui->verticalScrollBar->value()-20);
        }
        else
        {
            emit ui->verticalScrollBar->valueChanged(ui->verticalScrollBar->minimum());
            ui->verticalScrollBar->setSliderPosition(ui->verticalScrollBar->minimum());
        }
    }
}


这样,就实现了拖拽滑块或者鼠标滚轮来滚屏的功能

  • 11
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值