国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python3+PyQt5實現(xiàn)自定義流體混合窗口部件

2020-01-04 15:22:46
字體:
供稿:網(wǎng)友

本文通過Python3+PyQt5實現(xiàn)自定義部件–流體混合窗口部件。通過邏輯(窗口)坐標繪制而成。調(diào)用setWindow,所有的繪制工作都會根據(jù)邏輯坐標系發(fā)生。

#!/usr/bin/env python3from 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,QPolygonFclass 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_()

運行結(jié)果:

python3,PyQt5,窗口部件

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 繁昌县| 吴江市| 勐海县| 涿鹿县| 民乐县| 泰顺县| 黄浦区| 手机| 宾阳县| 区。| 突泉县| 阿鲁科尔沁旗| 同仁县| 壶关县| 霍邱县| 治县。| 年辖:市辖区| 湘潭市| 合肥市| 珲春市| 房山区| 双桥区| 陈巴尔虎旗| 锡林郭勒盟| 阿拉善左旗| 错那县| 龙江县| 临海市| 和平县| 贡嘎县| 红桥区| 襄汾县| 聂拉木县| 手游| 饶河县| 北川| 绿春县| 夏邑县| 池州市| 获嘉县| 邯郸县|