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

  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/findumars/p/5083407.html
Copyright © 2011-2022 走看看