Home > Backend Development > Python Tutorial > python3+PyQt5 implements custom fluid mixing widgets

python3+PyQt5 implements custom fluid mixing widgets

不言
Release: 2018-04-24 11:55:32
Original
2397 people have browsed it

This article mainly introduces python3 PyQt5 to implement custom fluid mixing widgets in detail. It has certain reference value. Interested friends can refer to it.

This article implements customization through Python3 PyQt5 Widget – Fluid Mixing widget. Drawn via logical (window) coordinates. Calling setWindow, all drawing work will occur according to the logical coordinate system.

#!/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_()
Copy after login

Run results:

##Related recommendations:


python3 PyQt5 uses database table view

python3 PyQt5 implements drag and drop function

python3 PyQt5 custom view detailed explanation

The above is the detailed content of python3+PyQt5 implements custom fluid mixing widgets. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template