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. command not found shell returned 127

    在 vim 修改某个文件后,退出时,报了如此一个错误.日志如下: 并不是什么大问题,只是在刚入坑 ssh 时,真的被人代入坑里了. # 强制退出并保存 :wq! 不是 :!wq,不知道有没有有缘的小伙 ...

  2. django信号 signal

    django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...

  3. VC.遍历文件夹中的文件

    1.VC下遍历文件夹中的所有文件的几种方法 - 年少要轻狂 - CSDN博客.html(https://blog.csdn.net/wllmsdn/article/details/27220999) ...

  4. 基于虹软人证核验 2.0 Android SDK开发集成入门

    一.功能介绍虹软人证核验 2.0 SDK(以下简称SDK)包含人脸检测.人脸跟踪.人证核验等能力,主要实现人证的1:1比对.其中暴露对外的功能方法有:active 引擎激活init 引擎初始化inpu ...

  5. git 命令详解

    初始化仓库 git init命令将目录初始化为一个仓库 git init 目录名 git 撤销commit git reset --hard <commit_id> git push or ...

  6. yum update软件包冲突

    因升级系统过程中断,重新进入系统继续升级出现如下问题(内容太多,只粘部分内容) # yum update 正在解决依赖关系 --> 正在检查事务 ---> 软件包 alsa-firmwar ...

  7. JAVA基础知识总结:十三

    测试用一个字符串常量创建一个字符串对象 1.获取这个字符串的长度 2.获取任意长度的子串 3.判断这个字符串是否为空 4.将这个字符串中的小写字母转化为大写字母 5.获取某个字符在字符串中第一次出现的 ...

  8. Jmeter 接口测试知识梳理——应用基础篇

    Jmeter 使用也有很长时间了,但是一直没有做一下知识梳理,近期会对公司同事做一下这方面的培训,借此机会,把使用过程中应用到的知识,或是遇到的问题,整理出来,方便大家学习! Jmeter 接口测试知 ...

  9. NGUI中处理层级问题的几个方法总结

    1.获得ui界面的UIPanel的最大层级: static int GetUIMaxDepth(Transform root) { UIPanel[] panels = root.GetCompone ...

  10. eclipse---->error and exception 和常用配置

    1.eclipse打开后报错:An internal error occurred during: "Initializing Java Tooling". java.lang.N ...