python3+PyQt5实现自定义流体混合窗口部件


Posted in Python onApril 24, 2018

本文通过Python3+PyQt5实现自定义部件?流体混合窗口部件。通过逻辑(窗口)坐标绘制而成。调用setWindow,所有的绘制工作都会根据逻辑坐标系发生。

#!/usr/bin/env python3

from PyQt5.QtCore import (QPointF, QSize, Qt,pyqtSignal)
from PyQt5.QtWidgets import (QApplication,
 QFrame, QLabel,
 QSizePolicy, QSpinBox, QWidget)
from PyQt5.QtGui import QColor,QPainter,QFontMetricsF,QBrush,QLinearGradient,QPolygon,QPolygonF

class YPipeWidget(QWidget):
 signal_valuechanged = pyqtSignal(int,int)
 def __init__(self, leftFlow=0, rightFlow=0, maxFlow=100,
   parent=None):
 super(YPipeWidget, self).__init__(parent)

 self.leftSpinBox = QSpinBox(self)
 self.leftSpinBox.setRange(0, maxFlow)
 self.leftSpinBox.setValue(leftFlow)
 self.leftSpinBox.setSuffix(" l/s")
 self.leftSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
 self.leftSpinBox.valueChanged.connect(self.valueChanged)
 self.rightSpinBox = QSpinBox(self)
 self.rightSpinBox.setRange(0, maxFlow)
 self.rightSpinBox.setValue(rightFlow)
 self.rightSpinBox.setSuffix(" l/s")
 self.rightSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
 self.rightSpinBox.valueChanged.connect(self.valueChanged)

 self.label = QLabel(self)
 self.label.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken)
 self.label.setAlignment(Qt.AlignCenter)
 fm = QFontMetricsF(self.font())
 self.label.setMinimumWidth(fm.width(" 999 l/s "))

 self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,
     QSizePolicy.Expanding))
 self.setMinimumSize(self.minimumSizeHint())
 self.valueChanged()


 def valueChanged(self):
 a = self.leftSpinBox.value()
 b = self.rightSpinBox.value()
 self.label.setText("{0} l/s".format(a + b))
 self.signal_valuechanged.emit(a,b)
 self.update()


 def values(self):
 return self.leftSpinBox.value(), self.rightSpinBox.value()


 def minimumSizeHint(self):
 return QSize(self.leftSpinBox.width() * 3,
   self.leftSpinBox.height() * 5)


 def resizeEvent(self, event=None):
 fm = QFontMetricsF(self.font())
 x = (self.width() - self.label.width()) / 2
 y = self.height() - (fm.height() * 1.5)
 self.label.move(x, y)
 y = self.height() / 60.0
 x = (self.width() / 4.0) - self.leftSpinBox.width()
 self.leftSpinBox.move(x, y)
 x = self.width() - (self.width() / 4.0)
 self.rightSpinBox.move(x, y)


 def paintEvent(self, event=None):
 LogicalSize = 100.0

 def logicalFromPhysical(length, side):
  return (length / side) * LogicalSize

 fm = QFontMetricsF(self.font())
 ymargin = ((LogicalSize / 30.0) +
   logicalFromPhysical(self.leftSpinBox.height(),
     self.height()))
 ymax = (LogicalSize -
  logicalFromPhysical(fm.height() * 2, self.height()))
 width = LogicalSize / 4.0
 cx, cy = LogicalSize / 2.0, LogicalSize / 3.0
 ax, ay = cx - (2 * width), ymargin
 bx, by = cx - width, ay
 dx, dy = cx + width, ay
 ex, ey = cx + (2 * width), ymargin
 fx, fy = cx + (width / 2), cx + (LogicalSize / 24.0)
 gx, gy = fx, ymax
 hx, hy = cx - (width / 2), ymax
 ix, iy = hx, fy

 painter = QPainter(self)
 painter.setRenderHint(QPainter.Antialiasing)
 side = min(self.width(), self.height())
 painter.setViewport((self.width() - side) / 2,
    (self.height() - side) / 2, side, side)
 painter.setWindow(0, 0, LogicalSize, LogicalSize)

 painter.setPen(Qt.NoPen)

 gradient = QLinearGradient(QPointF(0, 0),
      QPointF(0, 100))
 gradient.setColorAt(0, Qt.white)
 a = self.leftSpinBox.value()
 gradient.setColorAt(1, (Qt.red if a != 0 else Qt.white))
 painter.setBrush(QBrush(gradient))
 painter.drawPolygon(QPolygonF([QPointF(ax, ay), QPointF(bx, by), QPointF(cx, cy), QPointF(ix, iy)]))

 gradient = QLinearGradient(QPointF(0, 0), QPointF(0, 100))
 gradient.setColorAt(0, Qt.white)
 b = self.rightSpinBox.value()
 gradient.setColorAt(1, (Qt.blue if b != 0
    else Qt.white))
 painter.setBrush(QBrush(gradient))
 painter.drawPolygon(QPolygonF([QPointF(cx, cy), QPointF(dx, dy),QPointF(ex, ey),QPointF(fx, fy)]))

 if (a + b) == 0:
  color = QColor(Qt.white)
 else:
  ashare = (a / (a + b)) * 255.0
  bshare = 255.0 - ashare
  color = QColor(ashare, 0, bshare)
 gradient = QLinearGradient(QPointF(0, 0), QPointF(0, 100))
 gradient.setColorAt(0, Qt.white)
 gradient.setColorAt(1, color)
 painter.setBrush(QBrush(gradient))
 painter.drawPolygon(QPolygonF(
  [QPointF(cx, cy),QPointF(fx, fy),QPointF(gx, gy), QPointF(hx, hy),QPointF(ix, iy)]))

 painter.setPen(Qt.black)
 painter.drawPolyline(QPolygonF([QPointF(ax, ay), QPointF(ix, iy),QPointF(hx, hy)]))
 painter.drawPolyline(QPolygonF([QPointF(gx, gy), QPointF(fx, fy), QPointF(ex, ey)]))
 painter.drawPolyline(QPolygonF([QPointF(bx, by), QPointF(cx, cy), QPointF(dx, dy)]))

if __name__ == "__main__":
 import sys

 def valueChanged(a, b):
 print(a, b)

 app = QApplication(sys.argv)
 form = YPipeWidget()
 form.signal_valuechanged.connect(valueChanged)
 form.setWindowTitle("YPipe")
 form.move(0, 0)
 form.show()
 form.resize(400, 400)
 app.exec_()

运行结果:

python3+PyQt5实现自定义流体混合窗口部件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
python自定义异常实例详解
Jul 11 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
图解Python变量与赋值
Apr 03 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
Ubuntu+python将nii图像保存成png格式
Jul 18 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
python中使用.py配置文件的方法详解
Nov 23 Python
python3+PyQt5实现拖放功能
Apr 24 #Python
python3+PyQt5使用数据库表视图
Apr 24 #Python
python3+PyQt5使用数据库窗口视图
Apr 24 #Python
python下解压缩zip文件并删除文件的实例
Apr 24 #Python
python 删除指定时间间隔之前的文件实例
Apr 24 #Python
对python 各种删除文件失败的处理方式分享
Apr 24 #Python
Python向Excel中插入图片的简单实现方法
Apr 24 #Python
You might like
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
thinkphp分页集成实例
2017/07/24 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
js charAt的使用示例
2014/02/18 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
浅析Node.js实现HTTP文件下载
2016/08/05 Javascript
js面向对象编程总结
2017/02/16 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
python单链表实现代码实例
2013/11/21 Python
Python迭代用法实例教程
2014/09/08 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
初婚未育未抱养证明
2014/01/12 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python