环境: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

滚动条QScroolBar实现滚屏功能(屏幕过大,覆盖wheelEvent来处理滑轮事件)的更多相关文章

  1. Selenium2学习-027-WebUI自动化实战实例-025-JavaScript 在 Selenium 自动化中的应用实例之三(页面滚屏,模拟鼠标拖动滚动条)

    日常的 Web UI 自动化测试过程中,get 或 navigate 到指定的页面后,若想截图的元素或者指定区域范围不在浏览器的显示区域内,则通过截屏则无法获取相应的信息,反而浪费了无畏的图片服务器资 ...

  2. CentOS系统里如何正确取消或者延长屏幕保护自动锁屏功能(图文详解)

    不多说,直接上干货! 对于我这里想说的是,分别从CentOS6.X  和  CentOS7.X来谈及. 1. 问题:默认启动屏幕保护 问题描述: CentOS系统在用户闲置一段时间(默认为5分钟)后, ...

  3. 帆软报表(finereport)实现自动滚屏效果

    例如Demo:IOS平台年度数据报表. 展示内容丰富,一个页面中存在多个图表.内容,超出了浏览器窗口的大小导致内容展示不全. 为了能够预览这个报表的全部内容,可以使用JS滚屏效果来实现. 操作步骤: ...

  4. Atitit截屏功能的设计解决方案

    Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,,  复制 ...

  5. 滚屏加载--jQuery+PHP实现浏览更多内容

    滚屏加载技术,就是使用Javascript监视滚动条的位置,每次当滚动条到达浏览器窗口底部时,触发一个Ajax请求后台PHP程序,返回相应的数据,并将返回的数据追加到页面底部,从而实现了动态加载,其实 ...

  6. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇02:滚屏》

    2.滚屏 滚屏概述: 打飞机游戏场景背景设计通常很简单,因为角色敌人道具等都不与背景发生交互事件.开发者只需要根据设定的游戏类型,为游戏制作背景,模拟一个大环境即可. 滚屏原理: 材质UV动画,实现背 ...

  7. Android-锁屏功能

    当屏幕多久没有点击的时候,进行某种操作就是所谓的锁屏功能. onCreate: public void addRunnable() { handler.postDelayed(runnable, Co ...

  8. Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据

    使用ListView过程中,如果滚动加载数据的操作比较费时,很容易在滚屏时出现屏幕卡住的现象,一个解决的办法就是不要在滚动时加载数据,而是等到滚动停止后再进行数据的加载.这同样要实现OnScrollL ...

  9. javascript实现页面滚屏效果

    当我们浏览网页的时候,时常会碰到可以滚动屏幕的炫酷网页,今天笔者对这一技术进行简单实现,效果不及读者理想中那般炫酷,主要针对滚屏的技术原理和思想进行分享和分析.本示例在页面右侧有五个数字标签,代表五个 ...

随机推荐

  1. GWT工程 —— HostedMode(宿主模式下调试) 所有的运行命令

    Unknown argument: -helpGoogle Web Toolkit 1.7.0HostedMode [-noserver] [-port port-number | "aut ...

  2. Oracle中的日期和字符串互相转换

    转载出处:http://blog.sina.com.cn/s/blog_44a005380100k6rv.html TO_DATE格式(以时间:2007-11-02   13:45:25为例)    ...

  3. Hibernate工作流程

    Hibernate创建步骤 (五大核心接口:Configuration/SessionFactory/Session/Transaction/Query) 1.新建工程,导入需要的jar包. 2.利用 ...

  4. Linux 抓包

    tcpdump -i eth1 -s 0 -w eth1_2.log  tcp port 8893

  5. C++之继承和动态内存分配

    C++之继承和动态内存分配         如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将如何影响派生类的实现呢?这取决于派生类的属性,如果派生类也使用动态内存分配,这将如何实现呢?这种 ...

  6. python基础学习笔记4--抽象

    抽象 1.函数: 1) 函数是可以调用,它执行某种行为并且返回一个值.可以通过callable函数来判断函数是否可调用. eg:>>> def hello(name):        ...

  7. Changing the Auto-Logout Timeout in SSH

    SSH: We can set a timeout interval for ssh client who are idle or in inactive state. As soon as the ...

  8. 在python中编写socket服务端模块(二):使用poll或epoll

    在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...

  9. 老男孩python第六期

    01 python s6 day7 上节回顾02 python s6 day7 SNMP使用03 python s6 day7 大型监控架构讲解04 python s6 day7 Redis使用05 ...

  10. linux下mysql出现Access denied for user 'root'@'localhost' (using password: YES)解决方法

    # /etc/init.d/mysql stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking & # my ...