def __init__(self, leftFlow=0, rightFlow=0, maxFlow=100, parent=None): super(YPipeWidget, self).__init__(parent) self.leftSpinBox = QtWidgets.QSpinBox(self) self.leftSpinBox.setRange(0, maxFlow) self.leftSpinBox.setValue(leftFlow) self.leftSpinBox.setSuffix(" l/s") self.leftSpinBox.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.connect(self.leftSpinBox, QtCore.SIGNAL("valueChanged(int)"), self.updateValue) self.rightSpinBox = QtWidgets.QSpinBox(self) self.rightSpinBox.setRange(0, maxFlow) self.rightSpinBox.setValue(rightFlow) self.rightSpinBox.setSuffix(" l/s") self.rightSpinBox.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.connect(self.rightSpinBox, QtCore.SIGNAL("valueChanged(int)"), self.updateValue) self.label = QtWidgets.QLabel(self) self.label.setFrameStyle(QtWidgets.QFrame.StyledPanel | QtWidgets.QFrame.Sunken) self.label.setAlignment(QtCore.Qt.AlignCenter) fm = QtGui.QFontMetricsF(self.font()) self.label.setMinimumWidth(fm.horizontalAdvance(" 999 l/s ")) self.setSizePolicy( QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding, )) self.setMinimumSize(self.minimumSizeHint()) self.updateValue()
def minimumSizeHint(self): font = QtGui.QFont(self.font()) font.setPointSize(font.pointSize() - 1) fm = QtGui.QFontMetricsF(font) return QtCore.QSize( int(fm.horizontalAdvance(FractionSlider.WSTRING) * self.__denominator), int((fm.height() * 4) + FractionSlider.YMARGIN), )
def paintEvent(self, event=None): font = QtGui.QFont(self.font()) font.setPointSize(font.pointSize() - 1) fm = QtGui.QFontMetricsF(font) fracWidth = fm.horizontalAdvance(FractionSlider.WSTRING) indent = fm.boundingRect("9").width() / 2.0 if not X11: fracWidth *= 1.5 span = self.width() - (FractionSlider.XMARGIN * 2) value = self.__numerator / float(self.__denominator) painter = QtGui.QPainter(self) painter.setRenderHint(QtGui.QPainter.Antialiasing) painter.setRenderHint(QtGui.QPainter.TextAntialiasing) painter.setPen(self.palette().color(QtGui.QPalette.Mid)) painter.setBrush(self.palette().brush(QtGui.QPalette.AlternateBase)) painter.drawRect(self.rect()) segColor = QtGui.QColor(QtCore.Qt.green).darker(120) segLineColor = segColor.darker() painter.setPen(segLineColor) painter.setBrush(segColor) painter.drawRect( FractionSlider.XMARGIN, FractionSlider.YMARGIN, span, fm.height() ) textColor = self.palette().color(QtGui.QPalette.Text) segWidth = span / self.__denominator segHeight = fm.height() * 2 nRect = fm.boundingRect(FractionSlider.WSTRING) x = FractionSlider.XMARGIN yOffset = segHeight + fm.height() for i in range(self.__denominator + 1): painter.setPen(segLineColor) painter.drawLine(x, FractionSlider.YMARGIN, x, segHeight) painter.setPen(textColor) y = segHeight rect = QtCore.QRectF(nRect) rect.moveCenter(QtCore.QPointF(x, y + fm.height() / 2.0)) painter.drawText(rect, QtCore.Qt.AlignCenter, "{}".format(i)) y = yOffset rect.moveCenter(QtCore.QPointF(x, y + fm.height() / 2.0)) painter.drawText( rect, QtCore.Qt.AlignCenter, "{}".format(self.__denominator) ) painter.drawLine( QtCore.QPointF(rect.left() + indent, y), QtCore.QPointF(rect.right() - indent, y) ) x += segWidth span = int(span) y = FractionSlider.YMARGIN - 0.5 triangle = [ QtCore.QPointF(value * span, y), QtCore.QPointF((value * span) + (2 * FractionSlider.XMARGIN), y), QtCore.QPointF((value * span) + FractionSlider.XMARGIN, fm.height()), ] painter.setPen(QtCore.Qt.yellow) painter.setBrush(QtCore.Qt.darkYellow) painter.drawPolygon(QtGui.QPolygonF(triangle))
def resizeEvent(self, event=None): fm = QtGui.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 = QtGui.QFontMetricsF(self.font()) ymargin = (LogicalSize / 30.0) + logicalFromPhysical( self.leftSpinBox.height(), self.height()) ymax = int(LogicalSize - logicalFromPhysical(fm.height() * 2, self.height())) width = int(LogicalSize / 4.0) cx, cy = int(LogicalSize / 2.0), int(LogicalSize / 3.0) ax, ay = cx - int(2 * width), ymargin bx, by = cx - width, ay dx, dy = cx + width, ay ex, ey = cx + int(2 * width), ymargin fx, fy = cx + int(width / 2), cx + int(LogicalSize / 24.0) gx, gy = fx, ymax hx, hy = cx - int(width / 2), ymax ix, iy = hx, fy painter = QtGui.QPainter(self) painter.setRenderHint(QtGui.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(QtCore.Qt.NoPen) gradient = QtGui.QLinearGradient(QtCore.QPointF(0, 0), QtCore.QPointF(0, 100)) gradient.setColorAt(0, QtCore.Qt.white) a = self.leftSpinBox.value() gradient.setColorAt(1, (QtCore.Qt.red if a != 0 else QtCore.Qt.white)) painter.setBrush(QtGui.QBrush(gradient)) painter.drawPolygon( QtGui.QPolygon([ QtCore.QPoint(ax, ay), QtCore.QPoint(bx, by), QtCore.QPoint(cx, cy), QtCore.QPoint(ix, iy) ])) gradient = QtGui.QLinearGradient(QtCore.QPointF(0, 0), QtCore.QPointF(0, 100)) gradient.setColorAt(0, QtCore.Qt.white) b = self.rightSpinBox.value() gradient.setColorAt(1, (QtCore.Qt.blue if b != 0 else QtCore.Qt.white)) painter.setBrush(QtGui.QBrush(gradient)) painter.drawPolygon( QtGui.QPolygon([ QtCore.QPoint(cx, cy), QtCore.QPoint(dx, dy), QtCore.QPoint(ex, ey), QtCore.QPoint(fx, fy) ])) if (a + b) == 0: color = QtGui.QColor(QtCore.Qt.white) else: ashare = int((a / (a + b)) * 255.0) bshare = int(255.0 - ashare) color = QtGui.QColor(ashare, 0, bshare) gradient = QtGui.QLinearGradient(QtCore.QPointF(0, 0), QtCore.QPointF(0, 100)) gradient.setColorAt(0, QtCore.Qt.white) gradient.setColorAt(1, color) painter.setBrush(QtGui.QBrush(gradient)) painter.drawPolygon( QtGui.QPolygon([ QtCore.QPoint(cx, cy), QtCore.QPoint(fx, fy), QtCore.QPoint(gx, gy), QtCore.QPoint(hx, hy), QtCore.QPoint(ix, iy) ])) painter.setPen(QtCore.Qt.black) painter.drawPolyline( QtGui.QPolygon([ QtCore.QPoint(ax, ay), QtCore.QPoint(ix, iy), QtCore.QPoint(hx, hy) ])) painter.drawPolyline( QtGui.QPolygon([ QtCore.QPoint(gx, gy), QtCore.QPoint(fx, fy), QtCore.QPoint(ex, ey) ])) painter.drawPolyline( QtGui.QPolygon([ QtCore.QPoint(bx, by), QtCore.QPoint(cx, cy), QtCore.QPoint(dx, dy) ]))