温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-06-28 10:34:25 来源:亿速云 阅读:133 作者:小新 栏目:开发技术

小编给大家分享一下python3+PyQt5如何实现自定义流体混合窗口部件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

实例如下

#!/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如何实现自定义流体混合窗口部件

以上是“python3+PyQt5如何实现自定义流体混合窗口部件”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI