上效果:


![Deskto

文章目录

  • | 导入模块
  • | 效果
    • 1.线程内修改界面
    • 2. 窗口淡入(淡出)
    • 3.窗口去边框
    • 4.透明
    • 5.圆环进度条实现
      • 注意!!! ShareTechMomo不是本机字体(放上Consolas可以),自行下载!
    • 6.水波进度条(正弦函数)
    • 7.汇入Dialog
  • | 全部代码
    • 做这个出来肯定是有用的啊, 看看我下次怎么为后续`TCP server v2.0`夯实基础咯!

| 导入模块

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import math

| 效果

1.线程内修改界面

参考文章https://blog.csdn.net/avatarhhh/article/details/105540255
线程内修改, PyQt5提供了信号 PyQt5.QtCore.QThread

class ProgressThread(QThread):signal = pyqtSignal()def run(self):for p in range(100):self.signal.emit()self.msleep(100)

其实,如果不是准时设置, 你也可以不重写run函数, 直接调用signal.emit方法即可

2. 窗口淡入(淡出)

参考文章https://blog.csdn.net/weixin_52132159/article/details/122549237…
直接写了个方法, 直接调用即可, anim类要绑定或保存在一个全局或类变量中, 在单独的函数结束中anim会直接执行__del__()方法

def Animation(parent, type=b"windowOpacity", from_value=0, to_value=1, ms=1000, connect=None):anim = QPropertyAnimation(parent, type)anim.setDuration(ms)anim.setStartValue(from_value)anim.setEndValue(to_value)if connect:anim.finished.connect(connect)anim.start()return anim

3.窗口去边框

self.setWindowFlags(Qt.FramelessWindowHint)  # 去边框

4.透明

self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明

5.圆环进度条实现

注意!!! ShareTechMomo不是本机字体(放上Consolas可以),自行下载!

参考文章,在此基础上添加了不少东西https://blog.csdn.net/weixin_41611054/article/details/103660845

class RoundProgress(QWidget):m_waterOffset = 0.05m_offset = 50bg_color = QColor(255, 0, 0)fsize = 10def __init__(self, t, parent=None):super(RoundProgress, self).__init__(parent)self.resize(*t)self.size = tself.setWindowFlags(Qt.FramelessWindowHint)  # 去边框self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明self.percent = 0self.pen = QPen()gradient = QConicalGradient(50, 50, 91)gradient.setColorAt(0, QColor(255, 10, 10))gradient.setColorAt(1, QColor(255, 201 ,14))#gradient.setColorAt(0.5, QColor(255, 201 ,14))self.pen.setBrush(gradient)  # 设置画刷渐变效果self.pen.setWidth(8)self.pen.setCapStyle(Qt.RoundCap)self.font = QFont()self.font.setFamily("Consolas") #Share-TechMonoself.font.setPointSize(self.size[0] // 4)def paintEvent(self, event):width, height = self.sizerect = QRectF(self.fsize, self.fsize, width-self.fsize*2, height-self.fsize*2)painter = QPainter(self)rotateAngle = 360 * self.percent / 100# 绘制准备工作,启用反锯齿painter.setRenderHints(QPainter.Antialiasing)painter.setPen(self.pen)painter.drawArc(rect, (90 - 0) * 16, -rotateAngle * 16)  # 画圆环painter.setFont(self.font)painter.setPen(QColor(153 - 1.53*self.percent ,217-0.55*self.percent,234-0.02*self.percent)) # r:255, g:201 - 10/100 * percent, b: 14-4 /100*percent 当前渐变painter.drawText(rect, Qt.AlignCenter, "%d%%" % self.percent ) # 显示进度条当前进度self.update()def update_percent(self, p):self.percent = p

Qpainter画弧

6.水波进度条(正弦函数)

参考文章 https://blog.csdn.net/weixin_42512684/article/details/105227816…, 主要是我把QPainterPath裁剪成了圆形.

class WaterProgress(QWidget):fsize = 10def __init__(self,t,parent=None):super(WaterProgress, self).__init__(parent)self.setWindowFlags(Qt.FramelessWindowHint)  # 去边框self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明self.resize(*t)self.size = tself.layout = QGridLayout(self)#设置进度条颜色self.bg_color = QColor("#95BBFF")self.m_waterOffset = 0.005self.m_offset = 50self.m_borderwidth = 10self.percent = 0def paintEvent(self, event):painter = QPainter()painter.setRenderHint(QPainter.Antialiasing)painter.begin(self)painter.setPen(Qt.NoPen)#获取窗口的宽度和高度width,height = self.sizepercentage = 1 - self.percent/100# 水波走向:正弦函数 y = A(wx+l) + k# w 表示 周期,值越大密度越大w = 2 * math.pi / (width)# A 表示振幅 ,理解为水波的上下振幅A = height * self.m_waterOffset# k 表示 y 的偏移量,可理解为进度k = height *percentagewater1 = QPainterPath()water2 = QPainterPath()#起始点water1.moveTo(5,height)water2.moveTo(5,height)self.m_offset += 0.6if(self.m_offset >(width/2)):self.m_offset = 0i = 5rect = QRectF(self.fsize,self.fsize,width - self.fsize*2, height - self.fsize * 2)while(i < width-5):waterY1 = A*math.sin(w*i +self.m_offset ) + kwaterY2 = A*math.sin(w*i + self.m_offset + width/2*w) + kwater1.lineTo(i, waterY1)water2.lineTo(i, waterY2)i += 1water1.lineTo(width-5,height)water2.lineTo(width-5,height)totalpath = QPainterPath()#totalpath.addRect(rect)#painter.setBrush(Qt.gray)painter.drawRect(self.rect())painter.save()totalpath.addEllipse(rect)totalpath.intersected(water1)painter.setPen(Qt.NoPen)#设置水波的透明度watercolor1 =QColor(self.bg_color)watercolor1.setAlpha(100)watercolor2 = QColor(self.bg_color)watercolor2.setAlpha(150)path = totalpath.intersected(water1)painter.setBrush(watercolor1)painter.drawPath(path)path = totalpath.intersected(water2)painter.setBrush(watercolor2)painter.drawPath(path)painter.restore()painter.end()#self.update()def update_percent(self, p):self.percent = pif self.m_waterOffset < 0.05:self.m_waterOffset += 0.001return p

7.汇入Dialog

哈哈, 这里就没参考文章了.

class Progress(QDialog):percent = 0def __init__(self, text="",parent=None):super(Progress, self).__init__(parent)Font = QFont()Font.setFamily("Consolas")Font.setPointSize(12)self.setFont(Font)self.setWindowFlags(Qt.FramelessWindowHint)  # 去边框self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明self.ProgressThread = ProgressThread()self.ProgressThread.signal.connect(self.percentUpdate)self.ProgressThread.start()width, height = 230, 230self.resize(width, height)self.water = WaterProgress((width, height), self)self.round = RoundProgress((width, height), self)self.label = QLabel(self)self.label.setText(QCoreApplication.translate("Dialog", text))print(self.label.width())self.label.move((width-self.label.width())/2, height/3*2)QMetaObject.connectSlotsByName(self)self.anim = Animation(self, )def connect(self, link):print(type(link))#self.setWindowFlags(Qt.WindowStaysOnTopHint) #置顶self.show()def percentUpdate(self):self.percent += 1self.water.update_percent(self.percent)self.water.paintEvent(None)self.round.update_percent(self.percent)
if __name__ == '__main__':app = QApplication(sys.argv)r = Progress("<a link='b'>write something</a>")r.show()sys.exit(app.exec_())

| 全部代码

一个个粘贴太麻烦了, 直接给你汇总了:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import math
def Animation(parent, type=b"windowOpacity", from_value=0, to_value=1, ms=1000, connect=None):anim = QPropertyAnimation(parent, type)anim.setDuration(ms)anim.setStartValue(from_value)anim.setEndValue(to_value)if connect:anim.finished.connect(connect)anim.start()return anim
class ProgressThread(QThread):signal = pyqtSignal()def run(self):for p in range(100):self.signal.emit()self.msleep(100)
class RoundProgress(QWidget):m_waterOffset = 0.05m_offset = 50bg_color = QColor(255, 0, 0)fsize = 10def __init__(self, t, parent=None):super(RoundProgress, self).__init__(parent)self.resize(*t)self.size = tself.setWindowFlags(Qt.FramelessWindowHint)  # 去边框self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明self.percent = 0self.pen = QPen()gradient = QConicalGradient(50, 50, 91)gradient.setColorAt(0, QColor(255, 10, 10))gradient.setColorAt(1, QColor(255, 201 ,14))#gradient.setColorAt(0.5, QColor(255, 201 ,14))self.pen.setBrush(gradient)  # 设置画刷渐变效果self.pen.setWidth(8)self.pen.setCapStyle(Qt.RoundCap)self.font = QFont()self.font.setFamily("Share-TechMono") #Share-TechMonoself.font.setPointSize(self.size[0] // 4)def paintEvent(self, event):width, height = self.sizerect = QRectF(self.fsize, self.fsize, width-self.fsize*2, height-self.fsize*2)painter = QPainter(self)rotateAngle = 360 * self.percent / 100# 绘制准备工作,启用反锯齿painter.setRenderHints(QPainter.Antialiasing)painter.setPen(self.pen)painter.drawArc(rect, (90 - 0) * 16, -rotateAngle * 16)  # 画圆环painter.setFont(self.font)painter.setPen(QColor(153 - 1.53*self.percent ,217-0.55*self.percent,234-0.02*self.percent)) # r:255, g:201 - 10/100 * percent, b: 14-4 /100*percent 当前渐变painter.drawText(rect, Qt.AlignCenter, "%d%%" % self.percent ) # 显示进度条当前进度self.update()def update_percent(self, p):self.percent = p
class WaterProgress(QWidget):fsize = 10def __init__(self,t,parent=None):super(WaterProgress, self).__init__(parent)self.setWindowFlags(Qt.FramelessWindowHint)  # 去边框self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明self.resize(*t)self.size = tself.layout = QGridLayout(self)#设置进度条颜色self.bg_color = QColor("#95BBFF")self.m_waterOffset = 0.005self.m_offset = 50self.m_borderwidth = 10self.percent = 0def paintEvent(self, event):painter = QPainter()painter.setRenderHint(QPainter.Antialiasing)painter.begin(self)painter.setPen(Qt.NoPen)#获取窗口的宽度和高度width,height = self.sizepercentage = 1 - self.percent/100# 水波走向:正弦函数 y = A(wx+l) + k# w 表示 周期,值越大密度越大w = 2 * math.pi / (width)# A 表示振幅 ,理解为水波的上下振幅A = height * self.m_waterOffset# k 表示 y 的偏移量,可理解为进度k = height *percentagewater1 = QPainterPath()water2 = QPainterPath()#起始点water1.moveTo(5,height)water2.moveTo(5,height)self.m_offset += 0.6if(self.m_offset >(width/2)):self.m_offset = 0i = 5rect = QRectF(self.fsize,self.fsize,width - self.fsize*2, height - self.fsize * 2)while(i < width-5):waterY1 = A*math.sin(w*i +self.m_offset ) + kwaterY2 = A*math.sin(w*i + self.m_offset + width/2*w) + kwater1.lineTo(i, waterY1)water2.lineTo(i, waterY2)i += 1water1.lineTo(width-5,height)water2.lineTo(width-5,height)totalpath = QPainterPath()#totalpath.addRect(rect)#painter.setBrush(Qt.gray)painter.drawRect(self.rect())painter.save()totalpath.addEllipse(rect)totalpath.intersected(water1)painter.setPen(Qt.NoPen)#设置水波的透明度watercolor1 =QColor(self.bg_color)watercolor1.setAlpha(100)watercolor2 = QColor(self.bg_color)watercolor2.setAlpha(150)path = totalpath.intersected(water1)painter.setBrush(watercolor1)painter.drawPath(path)path = totalpath.intersected(water2)painter.setBrush(watercolor2)painter.drawPath(path)painter.restore()painter.end()#self.update()def update_percent(self, p):self.percent = pif self.m_waterOffset < 0.05:self.m_waterOffset += 0.001return p
class Progress(QDialog):percent = 0def __init__(self, text="",parent=None):super(Progress, self).__init__(parent)Font = QFont()Font.setFamily("Consolas")Font.setPointSize(12)self.setFont(Font)self.setWindowFlags(Qt.FramelessWindowHint)  # 去边框self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明self.ProgressThread = ProgressThread()self.ProgressThread.signal.connect(self.percentUpdate)self.ProgressThread.start()width, height = 230, 230self.resize(width, height)self.water = WaterProgress((width, height), self)self.round = RoundProgress((width, height), self)self.label = QLabel(self)self.label.setText(QCoreApplication.translate("Dialog", text))print(self.label.width())self.label.move((width-self.label.width())/2, height/3*2)QMetaObject.connectSlotsByName(self)self.anim = Animation(self, )def connect(self, link):print(type(link))#self.setWindowFlags(Qt.WindowStaysOnTopHint) #置顶self.show()def percentUpdate(self):self.percent += 1self.water.update_percent(self.percent)self.water.paintEvent(None)self.round.update_percent(self.percent)
if __name__ == '__main__':app = QApplication(sys.argv)r = Progress("<a link='b'>write something</a>")r.show()sys.exit(app.exec_())

做这个出来肯定是有用的啊, 看看我下次怎么为后续TCP server v2.0夯实基础咯!

PyQt5渐变圆环水波进度条+透明淡入(多线程信号)相关推荐

  1. java如何画百分比圆环_canvas绘制旋转的圆环百分比进度条

    作者:依然 |  时间:2015-05-29 |  阅读:122 canvas绘制旋转的圆环百分比进度条 从上一篇的文章使用HTML5 Canvas arc()绘制圆形/圆环 我们了解到了怎么使用ca ...

  2. CSS锥形渐变实现环形进度条

    10月份因为疫情原因.又开启了居家办公模式,空闲之余,与其选择"躺平",不如去做一些有意义的事情,内心的想法驱使着我去做些什么,但是又没有合适的素材,直到接手了最近的一个可视化项目 ...

  3. uni-app中自定义图表(canvas实现chart图表)开发篇(1)-圆环带进度条

    经常开发中,会遇到各种各样图表,这时大家普遍会想到去找插件.uniapp中常用的有uchart.js和echart.js,这对图表要求不高的项目来说,是很便捷的.但有时会遇到一些定制图表,加上UI的美 ...

  4. Vue实战--动态圆环百分比进度条

      最近在开发小程序的时候,碰到一个实现圆环百分比进度条的需求,类似如下设计图: 小白的我感觉实现起来有难度,于是上百度看看别人是怎么做的,结果没找到一个满意的,要不是静态的实现,就是需要用到比较多的 ...

  5. Android,水波进度条

    一.前言 这个自定义控件并不是我写的,而是Github上的一个开源控件. 实现方式非常的巧妙,涉及到的知识也比较多点.现在我就来和大家分析一下实现原理. https://github.com/geli ...

  6. Qml水波进度条、扇形进度条等其他进度条

    前言 分割线 正文 横线进度条 水波进度条 扇形进度条 前言 因为需求所致,需要采用进度条,开始采用的是普通的横线进度条,感觉效果也不错,后面改成了水波进度条,也就是好看了一点,在后面改成了扇形进度条 ...

  7. delphi fmx 跨平台水波进度条

    在网上经常看到js,qt的水波进度条, 于是想fmx应该也可以实现的, 于是从qt翻译过来一个水波进度条 如下图 我没封装成控件,动态创建就好了, 对于球形的水波进度,我没处理好,路径搞不出来 代码如 ...

  8. iOS实现一个颜色渐变的弧形进度条

    在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...

  9. ios弧形进度条_【iOS实现一个颜色渐变的弧形进度条】

    在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...

  10. 【原】Github系列之三:开源iOS下 渐变颜色的进度条WGradientProgress

    概述 今天我们来实现一个iOS平台上的进度条(progress bar or progress view).这种进度条比APPLE自带的更加漂亮,更加有"B格".它拥有渐变的颜色, ...

最新文章

  1. 自定义分辨率软件_苹果剪辑软件Final Cut Pro X导出竖屏视频教程
  2. 6.5 scp:远程文件复制
  3. 输出100以内所有的质数
  4. Sql语句查询某列A相同值的另一列B最大值的数据
  5. 诗词温习集:跟梁瀚文一起重温诗词(唐诗)之《春望》
  6. BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding
  7. 反向代理服务器域名解析
  8. 用css使图片产生毛玻璃效果
  9. NISP二级证书换CISP证书是怎么回事?
  10. html的表单可以加背景图片,如何装饰表单的背景和字符
  11. WDK_基于Fabric的区块链系统开发
  12. 爬虫—dy直播各个类别下直播数据
  13. CSS 行内元素设置高度
  14. Diva-Tp项测试详解
  15. IE中不能自动选择UTF-8编码的解决办法
  16. 提升eBay店铺流量的方式有哪些?
  17. 抓包工具fiddler安装配置及使用教程
  18. 线性回归一些基本术语
  19. 最优停止问题 简单综述 2005年
  20. [ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决

热门文章

  1. python学什么内容_老男孩Python都需要学什么内容?老男孩教育
  2. Luogu P4484 [BJWC2018]最长上升子序列
  3. 学习指南!双非渣本Android四年磨一剑,终局之战
  4. win10 无声音 耳机设备不显示 驱动显示正常 就是没有声音
  5. nginx 监听多个端口 80和81
  6. 适者生存还是强者生存
  7. 外贸常用邮箱有哪些?163mail邮箱适合外贸用吗?
  8. 如何用计算机校验信息,支付宝短信校验服务怎么开通?-电脑教程
  9. 河南计算机会考必背知识点,2017年河南物理高中会考知识点大全
  10. css学习记录第一天(选择器)