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 相关文章推荐
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
在Python中进行自动化单元测试的教程
Apr 15 Python
python网络编程之文件下载实例分析
May 20 Python
编写Python CGI脚本的教程
Jun 29 Python
python实现简单flappy bird
Dec 24 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
python占位符输入方式实例
May 27 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
配置python的编程环境之Anaconda + VSCode的教程
Mar 29 Python
Python socket服务常用操作代码实例
Jun 22 Python
Pandas之缺失数据的实现
Jan 06 Python
详解Go语言运用广度优先搜索走迷宫
Jun 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
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
网站上面有这种切换效果
2006/06/26 Javascript
JavaScript对象模型-执行模型
2008/04/28 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
详解使用Python处理文件目录的相关方法
2015/10/16 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
python线程池threadpool使用篇
2018/04/27 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
Python reversed函数及使用方法解析
2020/03/17 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
酒店总经理欢迎词
2014/01/08 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
市场总监岗位职责
2015/02/11 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
高质量“欢迎词”
2019/04/03 职场文书
导游词之江西赣州
2019/10/15 职场文书
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python