https://www.cnblogs.com/feiyangqingyun/p/6035633.html

根据Qt的实现,在PyQt上面实现了滑动开关的控件

import sys

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import * class SwitchBtn(QWidget):
#信号
checkedChanged = pyqtSignal(bool)
def __init__(self,parent=None):
super(QWidget, self).__init__(parent) self.checked = False
self.bgColorOff = QColor(255, 255, 255)
self.bgColorOn = QColor(0, 0, 0) self.sliderColorOff = QColor(100, 100, 100)
self.sliderColorOn = QColor(100, 184, 255) self.textColorOff = QColor(143, 143, 143)
self.textColorOn = QColor(255, 255, 255) self.textOff = "OFF"
self.textOn = "ON" self.space = 2
self.rectRadius = 5 self.step = self.width() / 50
self.startX = 0
self.endX = 0 self.timer = QTimer(self) # 初始化一个定时器
self.timer.timeout.connect(self.updateValue) # 计时结束调用operate()方法 #self.timer.start(5) # 设置计时间隔并启动 self.setFont(QFont("Microsoft Yahei", 10)) #self.resize(55,22) def updateValue(self):
if self.checked:
if self.startX < self.endX:
self.startX = self.startX + self.step
else:
self.startX = self.endX
self.timer.stop()
else:
if self.startX > self.endX:
self.startX = self.startX - self.step
else:
self.startX = self.endX
self.timer.stop() self.update() def mousePressEvent(self,event):
self.checked = not self.checked
#发射信号
self.checkedChanged.emit(self.checked) # 每次移动的步长为宽度的50分之一
self.step = self.width() / 50
#状态切换改变后自动计算终点坐标
if self.checked:
self.endX = self.width() - self.height()
else:
self.endX = 0
self.timer.start(5) def paintEvent(self, evt):
#绘制准备工作, 启用反锯齿
painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) #绘制背景
self.drawBg(evt, painter)
#绘制滑块
self.drawSlider(evt, painter)
#绘制文字
self.drawText(evt, painter) painter.end() def drawText(self, event, painter):
painter.save() if self.checked:
painter.setPen(self.textColorOn)
painter.drawText(0, 0, self.width() / 2 + self.space * 2, self.height(), Qt.AlignCenter, self.textOn)
else:
painter.setPen(self.textColorOff)
painter.drawText(self.width() / 2, 0,self.width() / 2 - self.space, self.height(), Qt.AlignCenter, self.textOff) painter.restore() def drawBg(self, event, painter):
painter.save()
painter.setPen(Qt.NoPen) if self.checked:
painter.setBrush(self.bgColorOn)
else:
painter.setBrush(self.bgColorOff) rect = QRect(0, 0, self.width(), self.height())
#半径为高度的一半
radius = rect.height() / 2
#圆的宽度为高度
circleWidth = rect.height() path = QPainterPath()
path.moveTo(radius, rect.left())
path.arcTo(QRectF(rect.left(), rect.top(), circleWidth, circleWidth), 90, 180)
path.lineTo(rect.width() - radius, rect.height())
path.arcTo(QRectF(rect.width() - rect.height(), rect.top(), circleWidth, circleWidth), 270, 180)
path.lineTo(radius, rect.top()) painter.drawPath(path)
painter.restore() def drawSlider(self, event, painter):
painter.save() if self.checked:
painter.setBrush(self.sliderColorOn)
else:
painter.setBrush(self.sliderColorOff) rect = QRect(0, 0, self.width(), self.height())
sliderWidth = rect.height() - self.space * 2
sliderRect = QRect(self.startX + self.space, self.space, sliderWidth, sliderWidth)
painter.drawEllipse(sliderRect) painter.restore() class MainWindow(QMainWindow):
def __init__(self,parent=None):
super(MainWindow, self).__init__(parent)
self.resize(400,200)
self.switchBtn = SwitchBtn(self)
self.switchBtn.setGeometry(10,10,60,30)
self.switchBtn.checkedChanged.connect(self.getState)
self.status = self.statusBar()
self.status.showMessage("this is a example", 5000)
self.setWindowTitle("PyQt") def getState(self,checked):
print("checked=", checked) if __name__ == "__main__":
app = QApplication(sys.argv)
form = MainWindow()
#form = SwitchBtn()
form.show()
sys.exit(app.exec_())

pyqt实现滑动开关的更多相关文章

  1. Python应用03 使用PyQT制作视频播放器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/ ...

  2. arcpy+PyQt+py2exe快速开发桌面端ArcGIS应用程序

    前段时间有一个项目,大体是要做一个GIS数据处理工具. 一般的方法是基于ArcObjects来进行开发,因为我对ArcObjects不太熟悉,所以就思考有没有其他简单快速的方法来做. 在查看ArcGI ...

  3. Pyqt 基础功能

    总结Pyqt的基础知识 1. Pyqt  设置禁止最大化及禁止拖拽窗口大小 # PyQT禁止窗口最大化按钮: self.setWindowFlags(QtCore.Qt.WindowMinimizeB ...

  4. 模拟提交API数据Pyqt版

    其实这个模拟提交数据之前已经写过篇: Python requests模拟登录 因为现在在做的项目中需要一个debug请求调试API,用PHP的CURL写了一个,又因Pyqt更能直观灵活的显示请求的参数 ...

  5. pyqt的信号槽机制(转)

    PySide/PyQt Tutorial: Creating Your Own Signals and Slots This article is part 5 of 8 in the series  ...

  6. Qt for Mac 安装(包括PyQt)

    下载Qt: http://qt-project.org/downloads Qt5.2 for Mac:http://download.qt-project.org/official_releases ...

  7. Pyqt+QRcode 生成 识别 二维码

    1.生成二维码 python生成二维码是件很简单的事,使用第三方库Python QRCode就可生成二维码,我用Pyqt给QRcode打个壳 一.python-qrcode介绍 python-qrco ...

  8. Pyqt 获取打包二进制文件中的资源

    记得有一次打开一个单独exe程序,点击btn中的一个帮助说明按钮,在同级目录下就多出一个help.chm 文件并自动打开. 那这个exe肯定是把help.chm 打包到exe中,当我触发“帮助”按钮的 ...

  9. Pyqt 动态的添加控件

    Pyqt 动态的添加控件 # -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * import sys ...

随机推荐

  1. 异步加载script,提高前端性能(defer和async属性的区别)

    一.异步加载script的好处 为了加快首屏响应速度,前端会采用代码切割.按需加载等方式优化性能.异步加载script也是一种前端优化的手段. 就好比如果我的页面其中一个功能需要打开地图,但是地图的j ...

  2. Python使用win32com实现的模拟浏览器功能

    # -*- coding:UTF- -*- #!/user/bin/env python ''' Created on -- @author: chenzehe ''' import win32com ...

  3. Android 用虹软SDK做人脸识别

    人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网 V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec ...

  4. MYSQL常用函数(格式化函数)

    DATE_FORMAT(date,fmt)  依照字符串fmt格式化日期date值 FORMAT(x,y)   把x格式化为以逗号隔开的数字序列,y是结果的小数位数 INET_ATON(ip)   返 ...

  5. [MySQL]典型的行列转换

    列变成行 测试数据库数据样式: 应用的sql语句: SELECT TM,NAME,SUM(GE) AS 'GE',SUM(GD) AS 'GD',SUM(CT) AS 'CT',SUM(NUM) AS ...

  6. 使用两个栈来完成一个队列,需要是实现的功能有add,poll.peek

    2017-06-23 19:15:16 队列时先进先出型,而栈是先进后出型,这就需要建立一个联系.我想到的一个简单的表示方式是: 这样就需要两个栈,栈1是用来实现add操作,即直接push进去就行:栈 ...

  7. 自动化部署之jenkins及简介

    一.什么是持续集成? (1)Continuous integration(CI) 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集 ...

  8. 百度Apollo学习(一)

    产品介绍 Nuvo-5095GC为工业电脑打开了新的篇章.作为首款面向CUDA计算.自动驾驶.深度学习及虚拟现实等新兴领域的嵌入式工控机,Nuvo-5095GC是一个高度集成.体积紧凑.稳定可靠的高性 ...

  9. 雷林鹏分享:jQuery EasyUI 扩展

    jQuery EasyUI 扩展 Portal(制作图表.列表.球形图等) 数据网格视图(DataGrid View) 可编辑的数据网格(Editable DataGrid) 可编辑的树(Editab ...

  10. Mycat水平拆分之十种分片规则

    水平切分分片实现   配置schema.xml  在同一个mysql数据库中,创建了三个数据库 testdb1,testdb2,testdb3.并在每个库中都创建了user表     <?xml ...