zoukankan      html  css  js  c++  java
  • 滚动条QScroolBar实现滚屏功能(屏幕过大,覆盖wheelEvent来处理滑轮事件)

    环境:Qt5

    编译器:Qt Creator

    需求:如图

    显示区域win 600*300

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

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

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

    实现过程:

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

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

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

    连接信号与槽

    声明一个滑块响应槽

    1. private slots:  
    2.       slot_ScroolWidget(int);  
    1. connect(ui->verticalScrollBar,SIGNAL(valueChanged(int)),this,SLOT(slot_ScroolWidget(int)));  

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

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

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

    槽函数实现

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

    获得滑块的位置value

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

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

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

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

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

    1. void fun::wheelEvent(QWheelEvent *event)  
    2. {  
    3.     int para=event->angleDelta().y();//获得鼠标滚轮的滚动距离para,para<0向下滚动,>0向上滚动  
    4.     if (para<0)  
    5.     {     
    6.         //向下滚动,设定鼠标滚轮每滚动一个单位,滑块就移动20个单位  
    7.         //加入此判断的理由是,若当时滑块处于90的位置上,一旦继续下滑20个单位,就会超过最大范围100,show界面就会移动超出范围。  
    8.         if (ui->verticalScrollBar->value()+20<=100)  
    9.         {  
    10.             //发射verticalScrollBar的信号valueChange(value+20),连接到了我们之前写的slot_ScrollWidget(int)槽上  
    11.             emit ui->verticalScrollBar->valueChanged(ui->verticalScrollBar->value()+20);verticalScrollBar的信号valueChange(value+20);  
    12.             //设定滚动之后的滑块位置  
    13.             ui->verticalScrollBar->setSliderPosition(ui->verticalScrollBar->value()+20);  
    14.         }  
    15.         else  
    16.         {  
    17.             emit ui->verticalScrollBar->valueChanged(ui->verticalScrollBar->maximum());  
    18.             ui->verticalScrollBar->setSliderPosition(ui->verticalScrollBar->maximum());  
    19.         }  
    20.     }  
    21.     else  
    22.     {  
    23.         //向上滚动  
    24.         if (ui->verticalScrollBar->value()-20>=0)  
    25.         {  
    26.             emit ui->verticalScrollBar->valueChanged(ui->verticalScrollBar->value()-20);  
    27.             ui->verticalScrollBar->setSliderPosition(ui->verticalScrollBar->value()-20);  
    28.         }  
    29.         else  
    30.         {  
    31.             emit ui->verticalScrollBar->valueChanged(ui->verticalScrollBar->minimum());  
    32.             ui->verticalScrollBar->setSliderPosition(ui->verticalScrollBar->minimum());  
    33.         }  
    34.     }  
    35. }  

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

    http://blog.csdn.net/shihoongbo/article/details/47103099

  • 相关阅读:
    动态调用WCF服务
    矩阵的坐标变换(转)
    【.NET线程--进阶(一)】--线程方法详解
    [转] Location语法规则
    [转] 深入理解vue 一些底层原理
    [转] lodash常用方法
    [转] Vue 组件间通信六种方式(完整版)
    [转] vuejs组件通信精髓归纳
    [转] 浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID
    [转] vue自定义组件中的v-model简单解释
  • 原文地址:https://www.cnblogs.com/findumars/p/5083407.html
Copyright © 2011-2022 走看看