上一章我们学习了QAbstractSlider的用法,在讲功能的时候我们是借助了它的子类QSlider来实现的,今天来学习一下它的三个子类——QSlider、QScroll和QDial。

一.QSlider控件

QSlider的信号全继承自其父类,还有几个自身的功能

1.标尺位置

QSlider.setTickPosition(self, position: 'QSlider.TickPosition')  #标尺设置
QSlider.tickPosition()                                           #标尺位置获取——>int
# type: 'QSlider.TickPosition'                                   #标尺位置枚举值
NoTicks = ...        # 0——无刻度
TicksAbove = ...     # 1——在水平的滑块上方(竖直布局在左侧)
TicksLeft = ...      # 1水平上方,数值左侧
TicksBelow = ...     # 2——水平下方,竖直右侧
TicksRight = ...     # 2——水平下方,竖直右侧
TicksBothSides = ...  # 3——两侧

2.标尺密度间隔

这个间隔是实际值的间隔,而不是像素值。比方说范围是0-100,如果间隔设为20则每20画一个标尺线。

QSlider.setTickInterval(self, ti: int)              #设定标尺间隔
QSlider.tickInterval()                              #获取标尺间隔

3.案例

基于QSlider我们做一个案例分析,要实现下面的效果

※在滑动的过程中有标签来显示当前的值

※标签位置在滑块上并且始终随着滑块的滑动

from PyQt5.Qt import *
from PyQt5 import QtGui
import sysclass MySlider(QSlider):def __init__(self,parent = None,*args,**kwargs):super().__init__(parent,*args,**kwargs)self.setup_UI()def setup_UI(self):self.label = QLabel('0',self)self.label.hide()def mousePressEvent(self, ev: QtGui.QMouseEvent):super().mousePressEvent(ev)    #增加功能x = (self.width()-self.label.width())/2y = (1-self.value()/(self.maximum()-self.minimum()))*(self.height()-self.label.height())self.label.move(x,y)self.label.show()self.label.setText(str(self.value()))def mouseMoveEvent(self, ev: QtGui.QMouseEvent):super().mouseMoveEvent(ev)x = (self.width() - self.label.width()) / 2y = (1 - self.value() / (self.maximum() - self.minimum())) * (self.height() - self.label.height())self.label.move(x,y)self.label.show()self.label.setText(str(self.value()))self.label.adjustSize()def mouseReleaseEvent(self, ev: QtGui.QMouseEvent):super().mouseReleaseEvent(ev)self.label.hide()class Window(QWidget):def __init__(self):super().__init__()self.UI_test()def UI_test(self):self.resize(500,300)slider = MySlider(self)label = QLabel('0',self)slider.move(50,50)pass
if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

QSlider案例

因为label要随着滑块的位置的变化而变化,所以难点就是在于对滑块位置的判定。

x的值就可以看作slider控件的中心位置,就是用slider的宽度减去label的宽度再除以2就可以了

而y的值就比较麻烦,

就是说

 label.y()/self.height() = (self.maximum()-self.value())/(self.maximum()-self.minimum()

但是这样还有些差距,因为我们没有考虑到标签自身的高度,所以要修改一下

 label.y()/(self.height()-label.heitht()) = (self.maximum()-self.value())/(self.maximum()-self.minimum()

简化一下就是有这么个关系

y = (1-self.value()/(self.maximum()-self.minimum()))*(self.height()-self.label.height())

二.QScrollBar控件

1.描述

QScrollBar一般很少单独使用,都是和QAbstractScrollArea一同使用来对界面进行滚动操作。它通常包括四个单独的控件:一个滑块、两个滚动箭头和页面控件

它的作用功能都是继承自QAbstractSlider的

2.创建

QScrollBar的创建分为水平滚动条和垂直滚动条,是在实例化的时候直接声明的

QScrollBar(Qt.Horizontal,self)   #水平
QScrollBar(Qt.Vertical,self)     #垂直

3.滚动条的长度

滚动条的长度是可以手动设置的,它有这么个关系

所以改变PageStep()的值就可以改变滚动块的大小。

三.QDial控件

QDial控件的外观和滚动块的不大一样,是一个旋钮

但是作用效果和滑块差不多,都是改变数值用的。除了继承父类的功能,它有些自己的API

1.刻度显示

QDial.setNotchesVisible(self, visible: bool)   #显示刻度
QDial.notchesVisible()                         #获取是否显示刻度——>bool

控件的刻度分为大刻度和小刻度。一个大刻度就是一个PageStep移动的值。

注意细节,和控件接触的就是大刻度,两个大刻度之间被小刻度等分。

2.包裹

在最大值和最小值之间是有一段空白的(就像上个图里的一样),如果想要一个360°无死角都有刻度的就要用到包裹设置了

QDial.setWrapping(self, on: bool)                #设置是否包裹
QDial.wrapping()                                 #获取是否设置包裹——>bool

启用包裹后的效果就是这样了

图里所示旋钮所在位置就是0。

3.刻度间隙

QDial.setNotchTarget(self, target: float)          #设置刻度之间的像素数
QDial.notchTarget()                                #获取刻度之间的像素数——>float

转载于:https://www.cnblogs.com/yinsedeyinse/p/10964404.html

GUI学习之二十一——QSlider、QScroll、QDial学习总结相关推荐

  1. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  2. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面

    先看之前的节点操作方法:Mr.J-- jQuery学习笔记(二十)--节点操作方法 Mr.J-- jQuery学习笔记(五)--属性及属性节点 Mr.J-- jQuery学习笔记(十一)--事件委托  ...

  3. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

  4. activiti学习(二十一)——流程虚拟机源码分析(三)——从进入到离开userTask

    前言 承接上文<activiti学习(二十)--流程虚拟机源码分析(二)--从开始节点离开到下个节点前>,假设execution接下来进入的节点是userTask,本文分析一下进入user ...

  5. Linux下的Samba学习(二)------用实验快速学习Samba服务器设置

    前言:在windows和linux的混合网络中,samba还是有很大用处的,本文用实验的方法快速学习Samba. [实验项目] ①在linux上建立Samba服务器,用类似FTP的客户端smbclie ...

  6. 深度学习(二十一)——SRCNN, DRCN, VDSR

    https://antkillerfarm.github.io/ 图像超分辨率算法(续) 前DL时代的SR 从信号处理的角度来说,LR之所以无法恢复成HR,主要在于丢失了图像的高频信息.(Nyquis ...

  7. 深度学习(二十一)基于FCN的图像语义分割-CVPR 2015-未完待续

    CNN应用之基于FCN的图像语义分割 原文地址:http://blog.csdn.net/hjimce/article/details/50268555 作者:hjimce 一.相关理论     本篇 ...

  8. javaweb学习总结(二十一)——JavaWeb的两种开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

  9. javaweb学习总结(二十一):JavaWeb的两种开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

  10. 嵌入式Linux系统编程学习之二十一命名管道(FIFO)

    文章目录 前言 一.创建.删除FIFO文件 1. 用函数创建和删除 FIFO 文件 2. 用命令创建和删除 FIFO 文件 二.打开.关闭FIFO文件 三.读写FIFO 前言   无名管道只能在有亲缘 ...

最新文章

  1. golang 位操作
  2. 科大星云诗社动态20201222
  3. IIS应用池保持激活工具开发
  4. csv文件导入导出到mysql
  5. 阿里云深圳数据中心正式开放
  6. LTE网络测试仪器和监控系统
  7. 如何看待快手领投知乎4.34亿美元融资?创始人周源亲自下场回答
  8. linux-磁盘结构
  9. 生成式对抗网络论文阅读整理
  10. C#设计模式系列:抽象工厂模式(AbstractFactory)
  11. React中的图片懒加载
  12. uikit框架_UIkit框架的口哨之旅
  13. Linux设备模型分析之bus(基于3.10.1内核)
  14. 如何制作微信春节头像,分享手机、电脑端制作头像的方法
  15. 使用谷歌学术检索论文小技巧
  16. 2022高处安装、维护、拆除考试题库模拟考试平台操作
  17. 干货分享:电脑无广告无弹窗的浏览器,这5款亲测干净好用
  18. 计算机音乐数字乐谱青芒,牵丝戏 - 青芒Qimo - 5SING中国原创音乐基地
  19. decltype的介绍
  20. 计算机等级考试17周岁能考吗,他,8岁计算机过二级,16岁被保送清华,信息类竞赛大奖拿到手软...

热门文章

  1. 拓端tecdat|如何用R语言绘制生成正态分布图表
  2. 拓端tecdat|R语言空间可视化:绘制英国脱欧投票地图
  3. 拓端tecdat|R语言马尔可夫转换模型研究交通伤亡人数事故预测
  4. 拓端tecdat|R语言分层线性模型案例
  5. 图像处理-图像尺寸变换
  6. 论文笔记 | 使用GCN建模关系数据
  7. 网络安全:教你五招服务器安全维护技巧
  8. 银联公钥加密java实现_【技术贴】银联加密算法 (收藏版)
  9. 2021-08-13 初识servlet
  10. 2021-08-08三大范式与JDBC