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一键去抖音视频水印工具
Sep 14 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
python使用udp实现聊天器功能
Dec 10 Python
python爬虫超时的处理的实例
Dec 19 Python
在python中将字符串转为json对象并取值的方法
Dec 31 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
django框架单表操作之增删改实例分析
Dec 16 Python
Python基于pandas爬取网页表格数据
May 11 Python
Python中的Cookie模块如何使用
Jun 04 Python
两行代码解决Jupyter Notebook中文不能显示的问题
Apr 24 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
php生成shtml类用法实例
2014/12/09 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
ThinkPHP5&5.1框架关联模型分页操作示例
2019/08/03 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
python读取csv文件示例(python操作csv)
2014/03/11 Python
Python中的并发编程实例
2014/07/07 Python
Python中logging模块的用法实例
2014/09/29 Python
Python中使用装饰器和元编程实现结构体类实例
2015/01/28 Python
Python中标准模块importlib详解
2017/04/16 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
Pyqt5自适应布局实例
2019/12/13 Python
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
游戏商店:Eneba
2020/04/25 全球购物
幼儿园新学期寄语
2014/01/18 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书